Con il presente esempio si è voluto realizzare un codice Java che simuli la vita di un essere vivente, per illustrare le potenzialità dell’utilizzo dei Thread.
package prova.thread;
/**
*
* @author Abejan
* @version 28/12/2010
*/
public class ThreadEssereVivente extends Thread{
// stato=informazione dell'essere vivente, assumere uno dei presenti valori 'DORMIRE', 'MANGIARE', 'GIOCARE', 'RIPRODURSI', 'MORTO', nel caso del riprodursi deve generare due altri esseri viventi
private String stato;
public ThreadEssereVivente(String s) {
//passo al costuttore del Thread il nome del thread
super(s);
setStato("MANGIARE"); //lo stato iniziale dell'essere vivente è MANGIARE
}
@SuppressWarnings("static-access")
public void run() {
//se il presente thread ha superato la 4 generazione
// setto lo stato in morto
if (this.getName().length()>4){
setStato("MORTO");
}
if (stato=="MORTO"){
stampa_video();
}
//fin quando il tread é ancora in essere e lo stato non é in MORTO,
while (this.isAlive()&&stato!="MORTO") {
// randomizzo i 4 stati
switch ((int)(4*Math.random())+1) {
case 1:
setStato("DORMIRE");
stampa_video();
break;
case 2:
setStato("MANGIARE");
stampa_video();
break;
case 3:
setStato("GIOCARE");
stampa_video();
break;
case 4:
setStato("RIPRODURSI");
stampa_video();
riprodursi();
break;
}//end switch
try {
//attendo 1 secodo per il thread corrente
this.sleep(1000);
} catch (Exception e) {}
}//end while
}
//metodo che permette di generare due nuovi thread, figli di quello in essere
// e setta lo stato del presente thread in morto
private void riprodursi(){
//creo il primo thread figlio
ThreadEssereVivente tevf1 = new ThreadEssereVivente(String.valueOf(this.getName()+"0"));
tevf1.start();
//creo il secondo thread figlio
ThreadEssereVivente tevf2 = new ThreadEssereVivente(String.valueOf(this.getName()+"1"));
tevf2.start();
//setto lo stato del thread corrente, per farlo terminare
setStato("MORTO");
}
//stampa a video lo stato del thread
private void stampa_video(){
System.out.println("Thread '" + this.getName() +"' stato = "+this.getStato() + " Thread attivi = " + Thread.activeCount());
}
public void setStato(String stato) {
this.stato = stato;
}
public String getStato() {
return stato;
}
public static void main(String args[]) throws InterruptedException {
/* Lancio il primo thread */
ThreadEssereVivente tc1 = new ThreadEssereVivente("0");
tc1.start();
}
}