Effetti speciali e sviluppo giochi in Java(TM) -La teoria dietro i threads
di Anibal Wainstein (traduzione di Hanami Solutions)
3.0 La teoria dietro i threads
I programmi multi-threads hanno fatto la loro comparsa su PC
col rilascio di Windows 95. Sistemi operativi come
UNIX li avevano già da molto tempo. Un thread funziona come
un "piccolo operaio" che lavora col codice sorgente del
programma. Se avete svariati programmi che girano nel vostro sistema
, allora esiste almeno un thread per ogni programma.Alcuni programmi
possono avere svariati threads,per esempio un browser che supporti
Java.
Per avere delle applets Java animate siamo costretti a usare due
threads. Prima di tutto c'è il programma o thread principale
che è il thread proprio della Java Virtual Machine.
Questo viene usato per il cosidetto sistema di eventi che gestisce
l'input dell'utente come movimenti del puntatore del mouse ed
eventi relativi alla tastiera.
Nello scorso capitolo abbiamo lavorato solo col thread principale.
Il problema con le animazioni è che spesso richiedono
un thread che si occupi continuamente del codice dell'animazione.
Non possiamo usare il thread principale perché le altre
funzioni della applet smetterebbero di funzionare, l' applet
si bloccherebbe.
Un programma che si blocca, di solito lo fa perché
il thread principale resta incastrato in un ciclo del programma
e non riesce ad uscirne o entra in collisione con un altro
thread e si ferma. Supponiamo che due web designers stiano
lavorando ad una homepage. Se non decidono chi fa cosa,
finiranno allora per scrivere ognuno il lavoro dell'altro.
Questo porta ad aggressività, la cooperazione si
interrompe e con essa anche il progetto. Allo stesso modo
dovete essere cauti quando usate i threads.
3.0.1 I metodi start()
e stop() di una applet (l'interfaccia Runnable)
Le Applets non hanno un supporto naturale per i threads. Dovete
aggiungere il supporto per i thread aggiungendo l'interfaccia
Runnable:
import java.applet.*; import java.awt.*; public class threadtest extends Applet implements Runnable {
}
Nella nostra applet threadtest abbiamo "implements
Runnable". Con la dichiarazione "implements"
potete aggiungere svariate nuove funzioni ad una classe.
Si usa per aumentare le abilità della classe.
"Runnable" dà accesso a tre nuovi metodi: start(), stop()
e run(). In una applet che supporti i threads i metodi init() e
paint() sono dapprima chiamati dal thread principale
della Java Virtual Machine, il terzo metodo chiamato da questo
thread è il metodo start().
Nel metodo start() method potete inizializzare ed avviare il vostro
thread di animazione.
public Thread programthread = null; public void start()
{ if (animationthread == null) { animationthread = new Thread(this,"animationthread"); animationthread.start(); }
}
La variabile "animationthread" è una variabile globale all'interno
della applet e dovete dichiararla voi stessi. Quello che il metodo start()
fa per prima cosa ` di controllare che il thread non sia già
stato creato (a volte alcuni browsers possono eseguire il metodo start()
varie volte). Il prossimo passo è di creare il thread stesso.
Richiede un riferimento alla vostra applet (questa) ed un nome
che potrebbe essere uno qualunque (lo chiamiamo "animationthread"
per beneficio di semplicità). Fatto questo avviate il thread
col suo proprio metodo start().
Quando il visitatore della homepage cambia pagina o chiude il
browser, allora il metodo stop() viene immediatamente invocato
dal thread principale della applet:
public void stop()
{ if ((animationthread != null) && animationthread.isAlive()) animationthread.stop(); animationthread = null;
}
Per ragioni di sicurezza dovrete assicurarvi che il thread sia
creato e che sia in esecuzione col metodo isAlive(). Se è
così allora il thread viene fermato col proprio metodo stop()
ed impostiamo la variabile "animationthread" al valore
null.
Con ogni probabilità vi troverete sempre a semplicemente
copiare e incollare questi due metodi nei vostri programmi in futuro.
Sono metodi generali che hanno tutte le applet di giochi o di effetti
speciali.
Pagina seguente >>
|