Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 22
  1. #1

    programmazione concorrente (Thread)

    Ciao ragazzi, questo è il mio problema:

    Devo gestire un parcheggio composto da 2 posti auto, solo quando un’auto esce, ne può entrare un’altra.

    Il mio problema è che i thread precedendemente addormentati con il metodo wait(), non si risvegliano più..

    Cosa sto sbagliando


    Grazie mille.


    public class Sincronizzazione implements Runnable {
    static int autoParcheggiate = 0;
    static final int POSTI_LIBERI = 2;

    static int tMin = 3000;
    static int tMax = 6000;

    //Identificato auto
    int idAuto;

    public Sincronizzazione(int idAuto){
    System.out.println("Sono vivo auto: "+idAuto);
    this.idAuto = idAuto;
    }

    public synchronized void entra(){
    //Considera anche lo 0, quindi >=
    while (autoParcheggiate>=POSTI_LIBERI)
    {
    try {
    wait();
    } catch (InterruptedException e) {
    e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
    }
    }
    autoParcheggiate++;
    }

    public synchronized void esci(){

    autoParcheggiate--;
    System.out.println("Sono uscito auto: "+idAuto);
    notify();


    }


    @Override
    public void run() {

    entra();


    int tRandom = (int) Math.floor(Math.random() * tMax) + tMin;
    System.out.println("Sono entrato auto: "+idAuto+" per tempo: "+tRandom+" - autoParcheggiate: "+autoParcheggiate);
    try {
    Thread.sleep(tRandom);
    } catch (InterruptedException e) {
    e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
    }

    esci();



    }

    }
    Il primo social network dedicato interamente allo sport.
    Social Network
    ________________________________

  2. #2
    Dimenticavo, ho provato con notify e anche con notifyAll, nulla da fare non riesco a risvegliare i Thread precedentemente addormentati!!!
    Il primo social network dedicato interamente allo sport.
    Social Network
    ________________________________

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da andgio76 Visualizza il messaggio
    Il mio problema è che i thread precedendemente addormentati con il metodo wait(), non si risvegliano più..
    I due metodi entra() ed esci() di per sé sono corretti/sensati. Da quanto hai postato, però non si vede dove/come usi la classe Sincronizzazione.
    Il punto è che il lock usato è sulla istanza di Sincronizzazione, ovvero su ciascun oggetto che puoi creare della classe Sincronizzazione.
    Se hai creato es. 3 Thread passando lo stesso medesimo oggetto Sincronizzazione, allora il lock è comune e quindi funziona.
    Se per ciascun Thread hai istanziato un diverso oggetto Sincronizzazione, allora NON funziona. Lock differenti = nessuna mutua esclusione (né logica di attesa/risveglio tra thread).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    E aggiungo: sicuramente hai dovuto usare l'ultimo scenario che ho detto (oggetti Sincronizzazione differenti), perché il idAuto è "di istanza" e quindi in sostanza ciascuna auto deve essere rappresentata da un distinto oggetto Sincronizzazione.

    Il problema alla fine è anche di natura concettuale: il lock è su ciascuna auto, è questo che è sbagliato!
    Il lock deve essere uno solo, relativo ad un oggetto comune che rappresenta il "parcheggio".

    Detto in altro modo: devi proprio cambiare il design del tuo programmino.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    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
    ________________________________

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da andgio76 Visualizza il messaggio
    Como posso mettere questi thread in una coda FIFO? quello che voglio fare e rispettare l'ordine d'arrivo
    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.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Grazie mille, provo a leggere

    buona serata
    Il primo social network dedicato interamente allo sport.
    Social Network
    ________________________________

  8. #8
    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
    ________________________________

  9. #9
    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
    ________________________________

  10. #10
    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
    ________________________________

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.