You are on page 1of 11

Utilizzo dei thread

Una delle principali applicazioni dei thread quella di permettere di organizzare lesecuzione di lavori con attivit in foreground e in background: per esempio, mentre un thread gestisce lI/O con lutente, altri thread eseguono operazioni sequenziali di calcolo in background, nei fogli elettronici vengono utilizzati per le procedure di ricalcolo automatico, nei fogli word per effettuare la reimpaginazione oppure il controllo automatico del documento,

Un altro importante utilizzo dei thread quello di implementarli per eseguire attivit asincrone, come per esempio le operazioni di garbage collection nella gestione della RAM oppure nelle procedure di salvataggio automatico dati (backup schedulati)

Threads in Java
Il linguaggio Java mette a disposizione dellutente classi che implementano i thread in forma primitiva gi dalla sua definizione Esistono tre possibilit diverse per definire un thread in Java 1. creare un main; 2. creare una sottoclasse della classe Thread; 3. implementare linterfaccia Runnable
La prima modalit thread implicita in un programma Java in quanto ognuno di essi contiene almeno un singolo thread, corrispondente allesecuzione del metodo main() sulla JVM La seconda modalit consiste nel creare i thread come oggetti di sottoclassi della classe Thread La terza modalit consiste invece nellutilizzo dellinterfaccia Runnable, la quale risulta avere maggiore flessibilit rispetto al caso precedente

Java mette a disposizione la classe Thread fornita dal package java.lang. Essa fondamentale per la gestione dei thread poich in essa sono definiti i metodi per avviare, fermare, sospendere, riattivare ed eseguire tutte le procedure dei thread.

La prima modalit di creazione di thread in Java ottenuta ereditando da tale classe una sottoclasse che utilizzi il metodo run () con la segnatura
public void run(void)

Il metodo run definisce linsieme di istruzioni Java che ogni thread creato come oggetto di quella classe esegue concorrentemente con altri thread (nella classe Thread limplementazione del suo metodo vuota, pertanto in ogni sottoclasse derivata deve essere ridefinito con le istruzioni che costituiscono il corpo del thread, ovvero tutte le istruzioni che lo schedulatore deve eseguire quando il thread viene attivato)

Un programma che utilizza il thread si implementa quindi cos: si dichiara una classe principale allinterno della quale si specifica che in parallelo ad essa andr in esecuzione un thread si definisce il thread, a cui vengono attribuite le operazioni cosiddette leggere da svolgere

Per lesecuzione di un thread si deve pertanto scrivere una classe di prova che ne definisca unistanza e ne avvii lesecuzione

In questo caso si definisce loggetto containani (che sar il thread) nella classe di prova Provanani e si attiva il thread con il metodo start(): esso manda in esecuzione il metodo run() definito allinterno del thread

run nel thread

Come visto, necessario ereditare dalla classe Thread una sottoclasse che utilizzi il metodo run(), in cui questo metodo definisce linsieme di istruzioni Java che ogni Thread eseguir
Parte del programma che svolge le operazioni: thread Il metodo start() nella classe di prova invoca il metodo run(), che non pu essere chiamato direttamente La creazione di un oggetto thread non determina la sua esecuzione: il thread ancora in stato di attesa

Esempio thread
In questo modo si sono creati due thread concorrenti: il thread principale (associato al main); il thread thr creato dinamicamente al precedente, in cui lesecuzione dellistruzione thr.start() lancia in concorrenza lesecuzione del metodo run() del nuovo thread
main

thread

Unesecuzione del thread produce sullo schermo il seguente output:

Si pu osservare che ad ogni thread viene associato in modo automatico un nome: il primo thread ha nome main mentre a quelli successivi viene assegnato di default un nome con indice progressivo (come Thread-0)
Per esempio, lesecuzione seguente senza richiedere in out il nome del thread:

In modo analogo, per il corpo del thread:

Procedendo ad una inizializzazione del thread possibile cambiarne il nome, come nel caso

Il thread appena creato continua la sua evoluzione finch non completata la sua esecuzione; quindi termina in modo spontaneo

In altri casi pu risultare necessario fermare levoluzione del thread (tramite un altro thread) attraverso il metodo stop()
thr.stop(): main (classe di prova): viene modificata in modo da creare le due istanza con nomi diversi, thr2 e thr thread due: esegue unoperazione diversa output

thread uno: esegue una certa operazione

Esempio due thread in esecuzione


In questo esempio viene inserito un costruttore per assegnare il nome al thread main (classe di prova): viene modificata in modo da creare le due istanze con nomi diversi

thread con assegnazione nome mediante costruttore

Esempio due thread in esecuzione


Due esecuzioni producono sullo schermo il seguente output:

Si osserva come gli effetti della schedulazione producano risultati diversi