TicTac - Prof-Matteo-Palitto-JCMaxwell/MultiThreading GitHub Wiki
Implementa 2 threads che contano da 10 a 1.
Vuole mettere in evidenza come i due threads vengano eseguiti contemporaneamente.
Main Thread iniziata...
<TIC> TIC: 10 <-- inizio thread TIC
<TIC> TIC: 9
<TIC> TIC: 8
<TAC> TAC: 10 <-- inizio thread TAC
<TIC> TIC: 7
<TAC> TAC: 9 <--+
<TIC> TIC: 6 <--+--- TIC e TAC threads sono eseguite contemporaneamente
<TAC> TAC: 8 <--+
<TIC> TIC: 5
<TAC> TAC: 7
Main Thread completata! tempo di esecuzione: 2357ms <-- MAIN thread termina
THREAD 2 e' stata interrotta! bye bye... <-- thread TAC viene interrotta
<TIC> TIC: 4
<TIC> TIC: 3
<TIC> TIC: 2
<TIC> TIC: 1 <-- thread TIC termina normalmente
E' il thread principale, che ha il compito di avviare gli altri threads
E' il 1mo thread ad essere avviato, viene avviato subito dopo essere stato creato
// Posso creare un THREAD e avviarlo immediatamente
Thread tic = new Thread (new TicTac("TIC"));
tic.start();
E' il 2ndo thread, viene creato ma in questo caso viene avviato dopo un intervallo di tempo
// Posso creare un 2ndo THREAD e farlo iniziare qualche tempo dopo...
Thread tac = new Thread(new TicTac("TAC"));
try {
TimeUnit.MILLISECONDS.sleep(1111);
tac.start(); // avvio del secondo THREAD
} catch (InterruptedException e) {}
Threads possono essere interrotti, in questo caso il thread TAC viene lasciato "vivere" per 1234ms e poi lo si interrompe
try {
TimeUnit.MILLISECONDS.sleep(1234);
} catch (InterruptedException e) {}
tac.interrupt(); // stop 2nd THREAD
E' la classe che implementa i 2 threads.
Ci sono vari (troppi) metodi per creare un THREAD in Java, questo e' il mio preferito per i vantaggi che offre
- +1 si puo estendere da un altra classe
- +1 si possono passare parametri (usando il Costruttore)
- +1 si puo' controllare quando un THREAD inizia indipendentemente da quando e' stato creato Usando questo metodo si implementa l'interfaccia Runnable
class TicTac implements Runnable {
Lo studente interessato puo' ricercarsi gli altri modi per creare un thread in Java.
Ricordarsi che le variabili dichiarate STATIC sono variabili di CLASSE e sono comuni a tutti i threads (un unica variabile condivisa), se ne sconsiglia l'uso nelle classi che implementano i threads per i problemi di conflitto tra threads
Tutte le altre variabili appartengono al propio thread e non sono condivisi con gli altri threads
// non essesndo "static" c'e' una copia delle seguenti variabili per ogni THREAD
private String t;
private String msg;
cosa succede se la variabile "msg" la trasformiamo in Variabile di CLASSE usando STATIC?
Main Thread iniziata...
<TIC> TIC: 10
<TIC> TIC: 9
<TAC> TIC: 8 <-- e' un TAC o e' un TIC??? CHE CONFUSIONE!!!
<TIC> TAC: 10
<TAC> TIC: 7
<TIC> TAC: 9
<TAC> TIC: 6
<TIC> TAC: 8
Main Thread completata! tempo di esecuzione: 2350ms
THREAD 2 e' stata interrotta! bye bye...
<TAC> TIC: 5
<TIC> TIC: 4
<TIC> TIC: 3
<TIC> TIC: 2
<TIC> TIC: 1
// Costruttore, possiamo usare il costruttore per passare dei parametri al THREAD
public TicTac (String s) {
this.t = s;
}
E' il metodo che costituisce il thread (e' il metodo che viene eseguito quando il thread viene avviato)
i threads possono essere interrotti quando stanno eseguendo delle istruzioni "bloccanti" come lo sleep
nel caso il thread viene interrotto, si deve intercettare l'eccezione di tipo "InterruptedExeption" per concludere il thread in modo "pulito"
try {
TimeUnit.MILLISECONDS.sleep(400);
} catch (InterruptedException e) {
System.out.println("THREAD " + t + " e' stata interrotta! bye bye...");
return; //me ne vado = termino il THREAD
}