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 Thread
classe 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' Runnable
interfaccia:
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 Thread
classe, 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' Runnable
interfaccia, il thread può essere eseguito passando un'istanza della classe al Thread
costruttore 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++;
}}