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.