Thread Java


Thread Java

I thread consentono a un programma di funzionare in modo più efficiente facendo più cose contemporaneamente.

I thread possono essere utilizzati per eseguire attività complicate in background senza interrompere il programma principale.


Creazione di un filo

Ci sono due modi per creare un thread.

Può essere creato estendendo la Threadclasse e sovrascrivendo il suo run() metodo:

Estendi sintassi

public class Main extends Thread {
  public void run() {
    System.out.println("This code is running in a thread");
  }
}

Un altro modo per creare un thread è implementare l' Runnableinterfaccia:

Sintassi di implementazione

public class Main implements Runnable {
  public void run() {
    System.out.println("This code is running in a thread");
  }
}

Thread in esecuzione

Se la classe estende la Threadclasse, il thread può essere eseguito creando un'istanza della classe e chiamandone il start()metodo:

Estendi esempio

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");
  }
}

Se la classe implementa l' Runnableinterfaccia, il thread può essere eseguito passando un'istanza della classe al Threadcostruttore di un oggetto e quindi chiamando il start()metodo del thread:

Esempio di implementazione

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");
  }
}

Differenze tra thread "estendere" e "implementare".

La differenza principale è che quando una classe estende la classe Thread, non puoi estendere nessun'altra classe, ma implementando l'interfaccia Runnable, è possibile estendere anche da un'altra classe, come: class MyClass extends OtherClass implements Runnable.


Problemi di concorrenza

Poiché i thread vengono eseguiti contemporaneamente ad altre parti del programma, non è possibile sapere in quale ordine verrà eseguito il codice. Quando i thread e il programma principale leggono e scrivono le stesse variabili, i valori sono imprevedibili. I problemi che ne derivano sono chiamati problemi di concorrenza.

Esempio

Un esempio di codice in cui il valore dell'importo variabile è imprevedibile:

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++;
  }
}

Per evitare problemi di concorrenza, è meglio condividere il minor numero possibile di attributi tra i thread. Se gli attributi devono essere condivisi, una possibile soluzione consiste nell'usare il isAlive() metodo del thread per verificare se il thread ha terminato l'esecuzione prima di utilizzare qualsiasi attributo che il thread può modificare.

Esempio

Utilizzare isAlive()per prevenire problemi di concorrenza:

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++;
  }
}