Salve ho iniziato da poco i thread a lezione,ma ancora non ci sono sul funzionamento;il prof qualche giorno fa ha dato questo es:

Gioco_delle_n_SEDIE
Nel _ gioco _ delle _ n _ SEDIE, _ n+1 _ PARTECIPANTI _ si _ contendono _ i _ posti _ a _ sedere. _ Perde _ il_
PARTECIPANTE_che_non_riesce_ad_occupare_nessuna_se dia_(resta_in_piedi).
● Si_scriva_l'opportuno_codice_che_simula_il_gioco.
● Realizzare_un_thread_DISPLAY_che_stampa_a_video_lo _stato_di_occupazione_delle_sedie,_ad_
esempio_stampa_una_stringa_di_“0”_e_“*”,_dove_lo_“ 0”_rappresenta_una_sedia_libera_e_“*”_
rappresenta_una_sedia_occupata.



Allora quello che ho capito dei thread per quel poco che ho fatto;nello specifico su questo esercizio è(correggetemi se sbaglio):
al momento dell avvio i thread "partecipanti" devono cercare di occupare un posto,siccome i thread agiscono più o meno contemporaneamente
bisogna controllare che non vadano in conflitto,ossia: ad esempio che un thread occupi un posto già occupato.Per quanto detto io ho messo
i 2 metodi vediLibero() e bloccaPost() syncronized, in modo che nel run alla struttura posti acceda solo un thread.Ora mi chiedo in generale
dei thread vado a sincronizzare i metodi che eseguiti da + thread vanno a creare conflitti nella struttura dati ?
-inoltre non riesco a dare una risposta alla domanda //1 nella classe parteipante.
-non capisco perchè il metodo run di display non stampa come dovrebbe cioè ogni tanto va in loop, invece di stampare la situazione dopo un inserimento?

aiutoo



codice:
public class mainSedieMio{

	public static void main(String args[]){
		  int Nposti=5;
		  
        sedie s= new sedie(Nposti); 
       
        // partecipanti
        Thread p1=new partecipante(s,"giovanni");
        Thread p2=new partecipante(s,"billy");
        Thread p3=new partecipante(s,"gianPiter");
        Thread p4=new partecipante(s,"melinda");
        Thread p5=new partecipante(s,"lolita");
        Thread p6=new partecipante(s,"zassone");
       
        display d=new display(s);
               
        System.out.println("avvio del display");
       
        d.start();
        
        p1.start();//
        p2.start();//
        p3.start();//
        p4.start();//
        p5.start();//
        p6.start();//
	  }
	

}


public class sedie {
     
	 private int n;
	 boolean posti[];
	
	
	 public sedie(int nC){
			int n=nC;
	       posti =new boolean[n];	
	       
	       for(int i=0;i<n;i++){
	    	  posti[i]=false;  
	    	    
	        }
	       
	  }
	
	 int getNumeroSedie(){return n;}
	 void setNumeroSedie(int nP){ n=nP;   }
	 
	 
 public boolean[] dammiArraySedie(){
	 return posti;
 }
	 
	  
}

public class partecipante extends Thread{
	sedie reFsedie;
	String nomeThread;
	
	    partecipante(sedie sPaxato,String nome){
	    	reFsedie=sPaxato;
	        nomeThread=	nome;
	    }
	   
	synchronized public boolean vediLibero(int i,boolean posti[]){
	     	  if(posti[i]==false) return true;
	          return false;
	}    
	    
	synchronized public void bloccaPosto(int i,boolean posti[]){
		posti[i]=true;
	}
	
	public void run(){       	
	      
	      try{
	    	  boolean posti[]= reFsedie.dammiArraySedie();
	    		
	    	   sleep((int) (Math.random() * 1000));
	    	         for(int i=0;i<posti.length;i++){
						     if(vediLibero(i,posti)){
						    	  bloccaPosto(i,posti); 
				//1 Come è possibile che se inverto il bloccaPosto cn la stampa mi sballa tutto??   	 
						    	  System.out.println("mi chiamo:  "+this.getId()+  "   ed ho preso il posto:  "+i);
				    			  
						       return ;
						     }			    	 
			 	      }
	    	         
	    	         System.out.println("Sono il Thread " + this.getId()
	    						+ ". Ho perso :((((");
	    	         
		  }catch (Exception e){}
	 }
	    
	    
	    
	    
}//p
public class display extends Thread {
		
	sedie reFsedie;
	boolean fine=false;
	
	     display(sedie sPaxato){
	    	reFsedie=sPaxato;
	    }

public void run(){
	
         try{
        	 boolean posti[]= reFsedie.dammiArraySedie();
        	  
        	 while(fine==false){
        		 
        			int contaOccupati=0;
            		sleep((int) (Math.random() * 250));
        			
			        	   for(int i=0;i<posti.length;i++){
								    if(posti[i]==true){
								    //posto occupato	
								      System.out.print(" * ");
								      contaOccupati++;
								    }
								    
								    else{
								      System.out.print(" _ ");
								    }      	
							
			        	   }//for
			        	   
			        	  System.out.println();
			        	  if(contaOccupati==reFsedie.getNumeroSedie())
	                	  fine=true;
	          
	          }//w	  
			        
                    }catch (Exception e) {
					
					} 

}	    

}//d
Gioco delle n SEDIE Nel gioco delle n SEDIE, n+1 PARTECIPANTI si contendono i posti a sedere. Perde il PARTECIPANTE che non riesce ad occupare nessuna sedia (resta in piedi). ● Si scriva l'opportuno codice che simula il gioco. ● Realizzare un thread DISPLAY che stampa a video lo stato di occupazione delle sedie, ad esempio stampa una stringa di “0” e “*”, dove lo “0” rappresenta una sedia libera e “*” rappresenta una sedia occupata.