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 >>
|