Home E-Books Effetti speciali e sviluppo giochi in Java Come mettere un thread in modalità sleep 

Effetti speciali e sviluppo giochi in Java(TM) -Eccezioni, classi statiche e come mettere un thread in modalità sleep 

di Anibal Wainstein (traduzione di Hanami Solutions)

3.0.3 Eccezioni, classi statiche e come mettere un thread in modalità sleep  

Potreste aver notato che la applet nella scorsa sezione pesava molto sul processore. Forse non è necessario aggiornare "Ciao Italia!" ogni millisecondo, basta farlo una volta al secondo o anche meno. Dobbiamo quindi piazzare un ritardo nel ciclo del metodo run(). Col metodo sleep(), che esiste nella classe Thread , possiamo far "dormire" il thread un certo numero di millisecondi. Questo metodo è un cosidetto metodo statico. Un metodo di questo tipo può essere invocato senza bisogno di creare una istanza della classe (in altre parole, senza dover creare un oggetto basato su quella classe). Così basta scrivere:

Thread.sleep(1000);               

Ora il thread dormirà per esattamente 1000 millisecondi (che corrispondono esattamente ad un secondo). Le classi statiche possono essere utili a volte se vi trovate con una funzione molto utile in una classe di cui fate molto uso. A quel punto può essere una buona idea rendere la funzione statica ed avere la possibilità di risparmiare un pò di memoria non dovendo allocare memoria per un nuovo oggetto. La memoria richiesta per un metodo statico viene allocata per la prima volta quando la Java VM incontra la classe dove si trova il metodo statico. Tutti i futuri oggetti creati e basati su quella classe useranno sempre la stessa cella di memoria in cui il metodo statico si trova.

C'è qualcosa di cui dovete tenere conto. I metodi statici non possono funzionare con variabili non-statiche nella stessa classe. Comunque, questo non vale se le variabili sono anche statiche. Perché, vi chiederete? Perché non dovete allocare memoria per queste variabili (creando così un nuovo oggetto). Semplicemente non esistono quando la funzione statica viene invocata! L' effetto di usare variabili statiche è che se avete vari oggetti basati sulla stessa classe, condivideranno tutti la stessa variabile. Questo significa che se una variabile statica viene manipolata in un oggetto, allora il contenuto delle altre variabili statiche negli altri oggetti cambia anch'esso.

Ora probabilmente starete pensando di poter usare questo metodo liberamente e metterlo nei vostri cicli. No, mi spiace, non ci siamo ancora. Il problema con il metodo sleep() è che genera una eccezione che voi dovete rilevare. Le eccezioni sono usate in Java dai metodi per dire alla classe che li invoca che qualcosa è andato sbagliato. In questo caso un altro thread può interrompere il processo di sonno. Dovete sapere cosa sia successo e quindi la funzione genera una eccezione. Questa è più una seccatura che una comodità, perché se non rilevate l'eccezione, l'applet si interrompe, o come in alcuni casi, il compilatore semplicemente non la accetterà. Per prima cosa, collocate il metodo in un ciclo-try e poi rilevate l'eccezione in una dichiarazione catch

try
    Thread.sleep(1000);  }  catch (InterruptedException e)  {      System.out.println("Qualcosa ha interrotto il metodo sleep()") } 

Il ciclo di rilevazione richiede un argomento che deve essere una classe di eccezione. La classe di interruzione si chiama InterruptedException ed è generata da sleep(). Ci sono molti tipi di eccezioni, e tutti sono sotto classi della classe Exception. Altre eccezioni ben conosciute sono NullPointerException (appare quando hai provato un riferimento a vuoto), ArrayIndexOutOfBoundsException (appare quando hai specificato un indice negativo o troppo altro in un array) e IOException (un errore che compare leggendo un file). 
Per rendere il nostro "effetto" più interessante, rifacciamo il metodo run() della scorsa sezione:

public void run()
{
    while (true)     {         showStatus("Long");         try {Thread.sleep(1000);}          catch(InterruptedException e) {}         showStatus("Live");         try {Thread.sleep(1000);}         catch(InterruptedException e) {}         showStatus("Java!");         try {Thread.sleep(1000);}          catch(InterruptedException e) {}     } }
Per rendere il codice più leggibile , ho scritto il codice che gestisce la pausa su due linee e rimosso il messaggio println() , visto che non è molto interessante in questo caso sapere se un altro thread interrompe il processo di attesa. Riuscite ad immaginare cosa succederà ora? Per prima cosa il messaggio "Long" vien scritto nella finestra di status, e poi il thread aspetterà e poi ci sarà la scritta "Live", dopo un altro secondo, apparirà la scritta "Java!". Un altro secondo più tardi, il programma ricomincerà.

Clickate qua e vedrete. 

Noterete anche che il vostro computer non è così sotto sforzo rispetto all'altro esempio.

 

 


Pagina seguente >>