TicTac - Prof-Matteo-Palitto-JCMaxwell/MultiThreading GitHub Wiki

Descrizione

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

Codice

main()

E' il thread principale, che ha il compito di avviare gli altri threads

TIC

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();

TAC

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) {}

Interruzione di un THREAD

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

La Classe TicTac

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.

Variabili

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

    // Costruttore, possiamo usare il costruttore per passare dei parametri al THREAD
    public TicTac (String s) {
        this.t = s;
    }

Il metodo "run()"

E' il metodo che costituisce il thread (e' il metodo che viene eseguito quando il thread viene avviato)

Istruzioni bloccanti

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
            }
⚠️ **GitHub.com Fallback** ⚠️