You are on page 1of 6

I metodi stop(), suspend() e resume() sono sconsigliabili poich non sicuri dal momento che agiscono in modo diretto

su un thread senza alcun controllo sul suo stato di evoluzione. Essi possono pertanto determinare situazioni di stallo e di Dead Problemi analoghi non si manifestano invece con il metodo sleep(int): esso sospende temporaneamente un thread e lo riattiva dopo int millisecondi ripartendo dalla stessa istruzione dalla quale era stato interrotto Esiste inoltre un metodo che non interrompe immediatamente il thread ma gli segnala la necessit che si sospenda lasciandogli anche la scelta del momento opportuno, che non sar critico: si ottiene attraverso il metodo yield() Esso consente di trasferire il controllo del processore ad un altro thread. Questa situazione prende il nome di coroutining: il controllo del processore viene trasferito ad un altro thread, rimettendosi in coda, in attesa di poter riacquisire lesecuzione

Esempio rilascio thread con metodo yield()

La classe Racchetta nel metodo run() scrive il contenuto della variabile pallina, si sospende per un secondo e quindi cede lesecuzione a un altro thread mediante il metodo yield (): il thread che lo invoca viene posto in stato di attesa e reinserito nella lista dei processi pronti allo scadere dei millisecondi specificati dai parametri (i thread sono due) Poich limpostazione sleep(1000), la ripetizione di ogni coppia di scritte avviene ogni secondo
Lutilizzo del metodo sleep() deve essere effettuato implementando un meccaniscmo try/catch in quanto pu lanciare eccezioni InterruptedException, che devono essere catturate e gestite

Esempio rilascio thread con metodo yield()

Attraverso il metodo yield (), il thread che lo invoca viene posto in stato di attesa e reinserito nella lista dei processi pronti allo scadere dei millisecondi indicati. I thread sono tre, due dei quali usano lo stesso parametro (che quindi si ripete) e lultimo avente un parametro del metodo sleep() differente

Il metodo join ()
In alcuni casi potrebbe essere necessario attendere che termini lesecuzione di un thread prima di continuare quella di un altro: questo in pratica si traduce nella sospensione di un thread in attesa che un secondo termini la propria lesecuzione prima di riprendere quella del precedente. Il metodo da eseguire nel main sul thread che si intende aspettare dato da join()

Viene eseguito il conteggio da 1 a 20000 attraverso un thread al termine del quale esso si sospende per 5 secondi (dopodich passa al main). Prima della stampa a video della scritta finisce il thread deve aver terminato la propria esecuzione che comprende anche il tempo di sospensione riportato nel metodo sleep()

Priorit di un thread
Ogni thread ha lo stesso tempo di CPU a disposizione e in Java ognuno allatto della sua creazione eredita la priorit dal processo padre. Nonostante questo possibile modificare le politiche di allocazione delle risorse assegnando ai thread priorit diverse mediante linizializzazione di un valore compreso tra 1 e 10. Il metodo utilizzato per assegnare una data priorit al thread

Thread.setPriority(MAX_PRIORITY); Thread.setPriority(NORM_PRIORITY); Thread.setPriority(MIN_PRIORITY); a seconda della propria importanza di esecuzione


Lassegnazione della priorit di un thread avviene nel main prima del metodo start

Esempio priorit di un thread


Il metodo nel main passa come parametro ai due thread la loro importanza settandone uno al valore massimo (MAX_PRIORITY) e laltro al minimo (MIN_PRIORITY)

Un caso particolare potrebbe essere quello in cui tanti thread ad alta priorit ostacolano levoluzione di un thread a bassa priorit: il metodo yield() pu essere utilizzato per far evolvere il thread con priorit minore