Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    Stack Thread Safe-Autobloccante

    Salve ragazzi
    Qualcuno potrebbe aiutarmi ad implementare uno Stack Thread Safe-Autobloccante?Io ho provato così ma non so se sia giusto o meno
    codice:
    public class Stack<Info> { 
    private LinkedList<Info> s; 
    private int capacity;
     public synchronized int getCapacity() {
     return capacity; 
    } 
    public Stack(int capacity) { 
    this.capacity = capacity; 
    this.s = new LinkedList<Info>(); 
    } 
    public synchronized boolean isEmpty(){ 
    return s.size() == 0; 
    } 
    public synchronized boolean isFull(){ 
    return s.size() == capacity; 
    } 
    public synchronized int size(){ 
    return s.size(); 
    } 
    public synchronized void push(Info i) { 
    while(isFull()){ 
    try { s.wait(); 
    } catch (InterruptedException ex) { } 
    }
     s.add(i); 
    s.notifyAll();
     } 
    public synchronized Info pop(){ 
    while(isEmpty()){ 
    try { s.wait(); 
    } catch (InterruptedException ex) { } 
    } 
    s.notifyAll(); 
    return s.removeLast(); 
    } 
    public synchronized void reset(){
     s.removeAll(s); 
    } 
    }

  2. #2
    C'e' molto di gia' pronto da Java 6 in poi

    http://www.html.it/pag/18041/gestione-delle-code/

  3. #3
    ahimè lo so che c'è molto di già pronto. Ed è proprio per questo che i professori insistono a scendere nei dettagli ad un esame orale

  4. #4
    capisco.
    Allora guarda, non so se sia sufficiente a far funzionare il tuo programma
    pero'. a mio avviso, il seguente metodo e' sbagliato.

    codice:
    public synchronized void push(Info i) { 
         while(isFull()){ 
          try { s.wait(); } 
          catch (InterruptedException ex) { } }
          s.add(i); 
          s.notifyAll(); }
    fai il syncronized sul metodo, che significa che acquisti il lock su this
    cioe' sull'oggetto su cui viene chiamato il metodo.
    Poi chiami la wait su s. La wait rilascia un lock di cui si e' entrati in possesso
    tramite un blocco synchronized. Ovvero va chiamata sullo
    stesso oggetto su cui hai eseguito synchronized.

    In altre parole :
    ho chiami semplicemente wait() (= a this.wait())
    oppure chiami s.wait() dentro al blocco synchronized(s)

    documentazione a riguardo

    Un consiglio :
    codice:
    catch (InterruptedException ex) { }
    liberati del vizio di lasciare il blocco catch vuoto. Ti semplificherai la vita di molto.
    Metti anche solo un semplice ex.printStackTrace() o un throw new RuntimeException(ex),
    se non ti va di perdere molto tempo. Credimi ti conviene, anche se scrivi codice di prova.

  5. #5
    Grazie 1000 per i consigli! Comunque hai assolutamente ragione infatti è stato un errore di copia "s.wait()" ! Ho aggiungo synchronized e ho dimenticato di cancellare "s." infatti non aveva proprio senso

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.