Salve ho iniziato da poco i thread a lezione,ma ancora non ci sonosul 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![]()
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.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

sul funzionamento;il prof qualche giorno fa ha dato questo es:
Rispondi quotando