Appunti Classe Quarta Parte Tre Versione Ridotta 5

6
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 l’esecuzione

Transcript of Appunti Classe Quarta Parte Tre Versione Ridotta 5

Page 1: Appunti Classe Quarta Parte Tre Versione Ridotta 5

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 DeadProblemi 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 l’esecuzione

Page 2: Appunti Classe Quarta Parte Tre Versione Ridotta 5

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 l’esecuzione 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é l’impostazione è sleep(1000), la ripetizione di ogni coppia di scritte avviene ogni secondo

L’utilizzo del metodo sleep() deve essere effettuato implementando un meccaniscmo try/catch in quanto può lanciare eccezioni InterruptedException, che devono essere catturate e gestite

Page 3: Appunti Classe Quarta Parte Tre Versione Ridotta 5

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 l’ultimo avente un parametro del metodo sleep() differente

Page 4: Appunti Classe Quarta Parte Tre Versione Ridotta 5

Il metodo join ()In alcuni casi potrebbe essere necessario attendere che termini l’esecuzione 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 l’esecuzione 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()

Page 5: Appunti Classe Quarta Parte Tre Versione Ridotta 5

Priorità di un thread

Ogni thread ha lo stesso tempo di CPU a disposizione e in Java ognuno all’atto 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 l’inizializzazione 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

L’assegnazione della priorità di un thread avviene nel main prima del metodo start

Page 6: Appunti Classe Quarta Parte Tre Versione Ridotta 5

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

Esempio priorità di un thread

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