Java Thread Essere Vivente

2011 February 23

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();		 
	}	
}