Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2008
    Messaggi
    312

    sincronizzazione thread e classe vector

    Salve a tutti,
    ho nel mio software una memoria condivisa rappresentata da un vector.
    Più thread leggono e scrivono su questa struttura che è sincronizzata già di suo.
    Voglio fare in modo che il thread lettore si blocca sulla casella finchè questa non contiene dati. Ho creato questa stupida classe:
    public class buffer {
    private Vector<File> shared;
    public buffer(){
    shared = new Vector();
    }
    public void add(File f){
    synchronized(shared){
    shared.add(f);System.out.print(shared.size()+"add" );

    shared.notifyAll();
    }
    }
    public File get(int index) throws InterruptedException{
    synchronized(shared){System.out.print(shared.size( ));
    while(shared.get(index)==null)
    wait();
    return shared.get(index);
    }

    }
    Il problema persiste in quanto, nel momento in cui invoco la get su una casella(quest'ultima ancora non riempita) ho questa eccezione: java.lang.ArrayIndexOutOfBoundsException.

    Come posso risolvere il problema?

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2008
    Messaggi
    312
    Scusate, in quel caso è normale che dia un errore (ci sono arrivato tardi). Ho fatto la stessa cosa con un array
    public class buffer {
    private File[] shared;
    private int i;
    public buffer(int i){
    shared = new File[i];
    }
    public void add(File f,int j){
    synchronized(shared){
    shared[j] = f;

    shared.notifyAll();
    }
    }
    public File get(int index) throws InterruptedException{
    synchronized(shared){
    while(shared[i]==null)
    wait();
    return shared[i];
    }

    }

    }
    Il risultato non cambia, l'eccezione è:java.lang.IllegalMonitorStateException
    at java.lang.Object.wait(Native Method)
    proprio sulla funzione get

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da lio.b
    Il risultato non cambia, l'eccezione è:java.lang.IllegalMonitorStateException
    I wait/notify devono essere invocati su un oggetto di cui si possiede il "lock". Già ... ma tu tieni il lock su 'shared' e poi invochi wait() sulla istanza di buffer!!
    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
    Registrato dal
    Sep 2008
    Messaggi
    312
    Quindi dovrei scrivere:
    public File get(int index) throws InterruptedException{
    synchronized(shared){
    while(shared[i]==null)
    shared.wait
    return shared[i];
    }
    Così è corretto? Nel senso che fa quello che io voglio?

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da lio.b
    Così è corretto? Nel senso che fa quello che io voglio?
    Tecnicamente sì, si comporta in modo bloccante. Il add() inserisce e notifica. Il get() è "bloccante" se non c'è valore. Appena c'è si "sveglia" e lo ritorna.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2008
    Messaggi
    312
    Come pensavo, infatti funziona.
    Grazie

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 © 2026 vBulletin Solutions, Inc. All rights reserved.