Java -drade
Java-drade
Threads laat 'n program toe om meer doeltreffend te werk deur verskeie dinge op dieselfde tyd te doen.
Drade kan gebruik word om ingewikkelde take in die agtergrond uit te voer sonder om die hoofprogram te onderbreek.
Die skep van 'n draad
Daar is twee maniere om 'n draad te skep.
Dit kan geskep word deur die Thread
klas uit te brei en sy run()
metode te ignoreer:
Brei sintaksis uit
public class Main extends Thread { public void run() { System.out.println("This code is running in a thread");
}}
Nog 'n manier om 'n draad te skep, is om die Runnable
koppelvlak te implementeer:
Implementeer sintaksis
public class Main implements Runnable {
public void run() {
System.out.println("This code is running in a thread");
}
}
Lopende drade
As die klas die klas uitbrei Thread
, kan die draad uitgevoer word deur 'n instansie van die klas te skep en sy start()
metode te noem:
Brei Voorbeeld uit
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");
}
}
As die klas die Runnable
koppelvlak implementeer, kan die draad uitgevoer word deur 'n instansie van die klas na 'n Thread
objek se konstruktor oor te dra en dan die draad se
start()
metode te noem:
Implementeer voorbeeld
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");
}
}
Verskille tussen "verleng" en "implementering" van drade
Die groot verskil is dat wanneer 'n klas die Thread-klas uitbrei, jy nie enige ander klas kan uitbrei nie, maar deur die Runnable-koppelvlak te implementeer, is dit moontlik om ook uit 'n ander klas uit te brei, soos: klas MyClass extends OtherClass implements Runnable
.
Gelyktydige probleme
Omdat drade op dieselfde tyd as ander dele van die program loop, is daar geen manier om te weet in watter volgorde die kode sal loop nie. Wanneer die drade en hoofprogram dieselfde veranderlikes lees en skryf, is die waardes onvoorspelbaar. Die probleme wat hieruit voortspruit, word sameloopprobleme genoem.
Voorbeeld
'n Kodevoorbeeld waar die waarde van die veranderlike 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 gelyktydige probleme te vermy, is dit die beste om so min as moontlik eienskappe tussen drade te deel. As eienskappe gedeel moet word, is een moontlike oplossing om die isAlive()
metode van die draad te gebruik om te kyk of die draad klaar geloop het voordat enige eienskappe gebruik word wat die draad kan verander.
Voorbeeld
Gebruik isAlive()
om gelyktydige probleme te voorkom:
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++;
}}