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 Threadklas 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 Runnablekoppelvlak 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 Runnablekoppelvlak implementeer, kan die draad uitgevoer word deur 'n instansie van die klas na 'n Threadobjek 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++;
  }
}