DESCRIZIONE THREAD E SPIEGAZIONE ESERCIZI - GaglianoMattia4CinfoPeano/Thread GitHub Wiki

Creazione di due Thread: L'obiettivo è realizzare due classi che estendono la classe Thread, in questo caso le 2 classi sono HI e Hello. Il metodo "run" di entrambe le classi stampano 10 volte "Hi" ed "Hello", ma quando vengono eseguiti i due thread nel main si può vedere che Hi ed Hello vengono stampate casualmente e non in ordine. Creazione di più Thread con una sola classe: L'obiettivo è realizzare una classe che estende alla classe Thread, la classe Say. In questa classe si fa passare la variabile "cosaDire". Nel main, infatti, si creano 3 oggetti che passano parole diverse, "HI", "Hello" e "Ciao". Questo esercizio mostra che si possono creare più thread con una sola classe. Conflitto tra thread: L'obiettivo è realizzare una classe (Inc1000) che estende la classe Thread e che incrementa una variabile public static "count", di un'unità per millisecondo, fino ad arrivare a 1000. Si avviano i due thread di tipo Inc1000, nel main (TestInc1000) successivamente stampa il valore della variabile count . Comunque possiamo vederlo con nomeDellaClasse.nomeVariabile, quindi "Inc1000.count". Ci si aspetta che il programma stampi 2000, ma in realtà stampa un valore pari a 0 ; questo perché il main stesso è un thread, che stamperà il risultato prima che gli altri due avviati possano terminare la loro esecuzione (visto che i thread sono indipendenti). Per sopperire a questo problema si modifica il main aggiungendo, dopo aver avviato l'esecuzione dei due thread, il comando join (nomeThread.join). Questo permette ai thread di terminare la loro esecuzione prima che il main possa stampare il risultato. Però, tale risultato non sarà ancora 2000 e si aggirerà, intorno al 1000. Il problema è dato dal fatto che per incrementare una variabile statica il thread deve prelevare la variabile, cambiarne il valore e salvare tale modifica nella memoria. Questo causerà un incremento parziale della variabile. Si modifica quindi ulteriormente il progetto, aggiungendo un metodo nella classe Inc1000 che verrà eseguito nel metodo run del thread e che incrementerà a parte la variabile count. Tale metodo, avrà la caratteristica di essere un metodo Synchronized. Ora, il risultato della stampa di count sarà finalmente 2000. Un discorso generale sui thread si possono dire che sono come una CPU virtuale che incapsuli al suo interno i dati e il codice di un particolare programma. Un thread in conflitto invece avviene quando il risultato del programma è sbagliato e si vede un risultato diverso da quello aspettato tipo (Inc1000)(come citato sopra).