Java -threads
Java-threads
Met Threads kan een programma efficiënter werken door meerdere dingen tegelijk te doen.
Threads kunnen worden gebruikt om ingewikkelde taken op de achtergrond uit te voeren zonder het hoofdprogramma te onderbreken.
Een discussielijn maken
Er zijn twee manieren om een draad te maken.
Het kan worden gemaakt door de klasse uit te breiden Thread
en de methode ervan te overschrijven run()
:
Syntaxis uitbreiden
public class Main extends Thread { public void run() { System.out.println("This code is running in a thread");
}}
Een andere manier om een thread te maken, is door de Runnable
interface te implementeren:
Syntaxis implementeren
public class Main implements Runnable {
public void run() {
System.out.println("This code is running in a thread");
}
}
Lopende discussies
Als de klasse de klasse uitbreidt Thread
, kan de thread worden uitgevoerd door een instantie van de klasse te maken en de start()
methode ervan aan te roepen:
Voorbeeld uitbreiden
public class Main extends Thread {
public static void main(String[] args) {
Main thread = new Main();
thread.start();
System.out.println("This code is outside of the thread");
}
public void run() {
System.out.println("This code is running in a thread");
}
}
Als de klasse de Runnable
interface implementeert, kan de thread worden uitgevoerd door een instantie van de klasse door te geven aan Thread
de constructor van een object en vervolgens de methode van de thread aan te roepen
start()
:
Voorbeeld implementeren
public class Main implements Runnable {
public static void main(String[] args) {
Main obj = new Main();
Thread thread = new Thread(obj);
thread.start();
System.out.println("This code is outside of the thread");
}
public void run() {
System.out.println("This code is running in a thread");
}
}
Verschillen tussen threads "uitbreiden" en "implementeren"
Het grote verschil is dat wanneer een klasse de Thread-klasse uitbreidt, je geen andere klasse kunt uitbreiden, maar door de Runnable-interface te implementeren, is het ook mogelijk om uit te breiden vanuit een andere klasse, zoals: class MyClass extends OtherClass implements Runnable
.
Gelijktijdigheidsproblemen
Omdat threads tegelijkertijd met andere delen van het programma worden uitgevoerd, is er geen manier om te weten in welke volgorde de code zal worden uitgevoerd. Wanneer de threads en het hoofdprogramma dezelfde variabelen lezen en schrijven, zijn de waarden onvoorspelbaar. De problemen die hieruit voortvloeien worden concurrency problemen genoemd.
Voorbeeld
Een codevoorbeeld waarbij de waarde van het variabele bedrag onvoorspelbaar is:
public class Main extends Thread { public static int amount = 0; public static void main(String[] args) { Main thread = new Main(); thread.start(); System.out.println(amount); amount++; System.out.println(amount);
}public void run() { amount++;
}}
Om gelijktijdigheidsproblemen te voorkomen, is het het beste om zo min mogelijk attributen tussen threads te delen. Als attributen moeten worden gedeeld, is een mogelijke oplossing om de isAlive()
methode van de thread te gebruiken om te controleren of de thread klaar is met lopen voordat attributen worden gebruikt die de thread kan wijzigen.
Voorbeeld
Gebruik isAlive()
om gelijktijdigheidsproblemen te voorkomen:
public class Main extends Thread { public static int amount = 0; public static void main(String[] args) { Main thread = new Main(); thread.start(); // Wait for the thread to finish while(thread.isAlive()) { System.out.println("Waiting...");
}// Update amount and print its value System.out.println("Main: " + amount); amount++; System.out.println("Main: " + amount);
}public void run() { amount++;
}}