Ciao AndBin, il mio errore era proprio quello!!
Ti devo chiedere un altro piacere!
Como posso mettere questi thread in una coda FIFO? quello che voglio fare e rispettare l'ordine d'arrivo
Mi potresti gentilmente aiutare
Grazie
Ciao AndBin, il mio errore era proprio quello!!
Ti devo chiedere un altro piacere!
Como posso mettere questi thread in una coda FIFO? quello che voglio fare e rispettare l'ordine d'arrivo
Mi potresti gentilmente aiutare
Grazie
Il primo social network dedicato interamente allo sport.
Social Network
________________________________
Se intendi dire che l'ordine di uscita delle auto deve tassativamente rispettare l'ordine di entrata, allora serve un coordinamento ben preciso tra i thread. In sostanza vuol dire che anche dentro il esci() ci deve essere una logica di wait: se un thread (=auto) arriva a fare il esci() ma NON è il suo turno, allora deve stare in wait, finché non viene svegliato E è il suo turno di uscita.
Quindi alla fine la questione è di stabilire come determinare e gestire il turno delle auto. Si può fare in diversi modi e dipende anche da come hai strutturato le cose.
Purtroppo non ho molto tempo in questo momento. Ti suggerisco di leggere una discussione che avevo seguito tempo fa su un altro forum: http://www.iprogrammatori.it/forum-p...ad-t25343.html
In particolare poi verso la fine qui un mio esempio con spiegazione.
L'obiettivo era un po' differente dal tuo ma il concetto è similare. Se comprendi quell'esempio potresti quasi sicuramente riuscire a comprendere come fare quello che chiedi.
Come al solito, per qualunque dubbio chiedi pure qui, continuerò a monitorare questa discussione.![]()
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
AndBin, una domanda non si puo utilizzare un arraylist?
Ti invio il codice senza coda FIFO
public class Inizio {
public static void main(String[] args){
Prova xx = new Prova();
Sincronizzazione th1 = new Sincronizzazione(1,xx);
Thread thp1 = new Thread(th1);
thp1.start();
Sincronizzazione th2 = new Sincronizzazione(2,xx);
Thread thp2 = new Thread(th2);
thp2.start();
Sincronizzazione th3 = new Sincronizzazione(3,xx);
Thread thp3 = new Thread(th3);
thp3.start();
Sincronizzazione th4 = new Sincronizzazione(4,xx);
Thread thp4 = new Thread(th4);
thp4.start();
}
}
Il primo social network dedicato interamente allo sport.
Social Network
________________________________
Oggetto condiviso!!!
public class Prova extends Thread{
private static Integer auto=0;
public synchronized void entraNelParcheggio() throws InterruptedException{
while (auto>=2){
wait();
}
auto++;
}
public synchronized void esconoDalPacheggio(int esci){
auto--;
System.out.println("Sono uscito auto: "+esci);
notifyAll();
}
}
Il primo social network dedicato interamente allo sport.
Social Network
________________________________
Thread!!
public class Sincronizzazione implements Runnable {
private Prova miaProva;
static int tMin = 3000;
static int tMax = 6000;
//Identificato auto
int idAuto;
public Sincronizzazione(int idAuto,Prova Variabile){
System.out.println("Sono vivo auto: "+idAuto);
miaProva=Variabile;
this.idAuto = idAuto;
}
@Override
public void run() {
try {
miaProva.entraNelParcheggio();
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
int tRandom = (int) Math.floor(Math.random() * tMax) + tMin;
System.out.println("Sono entrato auto: "+idAuto+" per tempo: "+tRandom);
try {
Thread.sleep(tRandom);
} catch (InterruptedException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
miaProva.esconoDalPacheggio(idAuto);
}
}
Quello che vorrei fare, come hai detto tu, le macchina devono rispettare l'ordine d'ingresso.
Pero' mi piacerebbe usare un arraylist.
Quando hai tempo mi potresti inviare un esempio di codice
Grazie mille
Il primo social network dedicato interamente allo sport.
Social Network
________________________________
Ho letto brevemente e vagamente il codice ma così NON va bene già a partire dalle denominazioni: Prova e Sincronizzazione non vanno granché bene come nomi, nel senso che dicono molto molto poco. Inoltre la classe dell'oggetto condiviso non ha senso che estenda Thread.
Ripensa un attimo le classi, suggerisco es. Parcheggio (per l'oggetto condiviso) e Auto o AutoRunnable (per il Runnable da passare ad un Thread, gli oggetti Thread li crei poi al volo).
Se vuoi basarti solo sul idAuto (ovvero auto id=1 ha precedenza prima del 2, ecc... o il contrario ... come vuoi), allora non serve una collezione.
Se invece vuoi che il primo thread (=auto) che arriva al entraNelParcheggio() sia anche la prima ad uscire, allora sì, una collezione (ArrayList ok ma anche LinkedList è ok) è utile per tenere i riferimenti agli oggetti Thread.
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet