Creare Thread in Java


DOMANDA:

Cos'è e come si crea un Thread? 


RISPOSTA:

Il Thread è una parte di un processo che può essere lanciata parallelamente ad altre sottoparti per riuscire a concludere il processo iniziale in un tempo minore. 
Supponiamo che un processo sia fatto da due metodi che impiegano rispettivamente 10 e 7 secondi ad essere completati. In linea teorica se questi due metodi fossero lanciati in due Thread paralleli, il tempo totale sarebbe di 10 secondi (cioè il tempo massimo impiegato da uno dei due) invece dei 17 che impiegherebbero se eseguiti in sequenza.

Esistono due modi per creare un Thread: estendere la classe java.lang.Thread o implementare l'interfaccia java.lang.Runnable.

Il vantaggio di utilizzare Runnable è quello di lasciarci la libertà di estendere qualunque altra classe. Ricordiamo infatti che Java non consente l'ereditarietà multipla. 

Calcola1 è un Thread creato estendendo la classe Thread:

package thread;

public class Calcola1 extends Thread {
 
    @Override
    public void run() {
        long start = System.currentTimeMillis();
     
        for (int i = 0; i < 1000000000; i++) {}
     
        long end = System.currentTimeMillis();
        System.out.println("Tempo impiegato nel Thread 1: " + (end - start) + " ms.");
    }
}

Come si può vedere, estendendo Thread ci precludiamo la possibilità di farlo per altre classi.


La classe Calcola2 implementa l'interfaccia Runnable:

package thread;

public class Calcola2 implements Runnable {

    @Override
    public void run() {
        long start = System.currentTimeMillis();
   
        for (int i = 0; i < 1000000000; i++) {}
         
        long end = System.currentTimeMillis();
        System.out.println("Tempo impiegato nel Thread 2: " + (end - start) + " ms.");
    }
}

Se Calcola 2 dovesse anche estendere una classe non ci sarebbe alcun problema grazie all'implementazione di Runnable che ci lascia liberi di aggiungere un extends.


Infine la classe Test:

package thread;

public class Test {
 
    public static void main(String[] args) {
        Thread t1 = new Calcola1(); // questo è un vero Thread
        Thread t2 = new Thread(new Calcola2()); // questo è un Runnable
     
        long start = System.currentTimeMillis();
        t1.start();
        t2.start();
        while ( t1.isAlive() || t2.isAlive())
        {}
        long end = System.currentTimeMillis();
     
        System.out.println("Tempo totale: " + (end - start) + " ms." );
    }
}

Il while serve ad attendere che entrambi i Thread abbiano finito il loro ciclo di vita (grazie al metodo isAlive() fornito dalla classe Thread).


Una volta eseguito, un possibile risultato è il seguente:

Tempo impiegato nel Thread 2: 1180 ms.
Tempo impiegato nel Thread 1: 1210 ms.
Tempo totale: 1210 ms.

Il tempo totale non è la somma dei due parziali bensì il valore dell'operazione che ha richiesto più tempo ad essere eseguita.

Notiamo come i tempi impiegati dai Thread siano diversi, nonostante il codice sia lo stesso. Questo accade perché i due Thread non sono eseguiti esattamente insieme, ma la loro esecuzione è decisa dal sistema operativo in base agli altri processi in vita nel calcolatore.

Commenti

Post popolari in questo blog

Arrotondamento e troncamento in Java

Eclipse: Shortcuts (scorciatoie) da tastiera

Strutture dati: List, Set, Map

Creare un eseguibile Java