Problema sincronizzazione e l' uso di wait() e notify()

di il
1 risposte

Problema sincronizzazione e l' uso di wait() e notify()

public class Semaforo {

public void restart(){
synchronized(this){
System.out.println("Click su notify");
flag=false;
notify();

}
}
public void rewait() throws InterruptedException{
synchronized(this){

System.out.println("In attesa");

wait();

System.out.println("Uscito dal wait");

}

}
}

public class Command extends Thread implements Runnable {

Socket client;
ObjectOutputStream invia;
Boolean flag=true;
Semaforo s= new Semaforo();
public Command(Socket client,ObjectOutputStream invia){

this.client=client;
this.invia=invia;

}


public void run(){


try {
while(true){
synchronized(this){

invia.writeUTF(Grafica.testo. getText());
invia.flush();

invia.writeUTF(Grafica.testo2. getText());
invia.flush();

s.rewait();
} 
System.out.println("Uscito dall attesa");
}
} catch (IOException ex) {
Logger.getLogger(Command.class.getName()… log(Level.SEVERE, null, ex);
} catch (InterruptedException ex) {
Logger.getLogger(Command.class.getName()… log(Level.SEVERE, null, ex);
}

System.out.println("finito");
}
}

evento di una JBotton :
public void actionPerformed(ActionEvent e){


if("Invia".equals(e. getActionCommand())){
cont+=1;
if(cont==1)
Client.comandT.start();
else{
s.restart(); 
} 
}
}
Ciao ragazzi ho questo problema. Quando avvio il programma la classe "Command" va in attesa e quando clicco sul bottone(è qual frammento di codice con il metodo actionPerformed()) produce l evento ed esegue la run() della classe "command",ma appena clicco di nuovo il bottone per sbloccare il thread con il metodo notify() tramite il metodo s.restart() non va. Non da nessun tipo di errore, soltanto che il notify() lo eseguo, ma il thread continua ad essere in attesa wait(). Ho provate ad usare notifyAll() ma lo stesso nulla..Ho provato ad utilizzare il flag ma non va ugualmente.. Chiedo un aiuto

1 Risposte

  • Re: Problema sincronizzazione e l' uso di wait() e notify()

    Dallo stralcio di codice che hai incollato non si capisce molto perché manca la classe che contiene la actionPerformed per cui non si capisce le variabili come sono inizializzate; cmq se dici che la notify gira e l'altro thread resta in attesa è perchè stai agendo su due istanze della classe semaforo diverse.

    In effetti credo che il semaforo che si mette in wait sia inizializzato nella classe Command mentre l'altro nella classe che contiene la actionPerformed.

    Se vuoi che il semaforo sia unico per processo ti conviene fare un singleton ossia qlc del genere:
    public class Semaforo {
    private static Semaforo instance;
    static {
    instance = new Semaforo();
    }
    private Semaforo(){
    ...
    }
    public static Semaforo getSemaforo() {
     return instance;
    }
    ...
    }
    e dove instanzi un Semaforo anzichè fare
    Semaforo s = new Semaforo();
    fai
    Semaforo s = Semaforo.getSemaforo();
    Così sei sicuro che hai un'unica istanza del semaforo in tutto il processo.

    In ogni caso mi sembra sbagliata anche la gestione dei synchronized nella classe semaforo in quanto così com'è quando il primo thread sta nella rewait, il secondo non entrerà mai nel blocco synchronized della restart; secondo me dovresti levarli entrambi.
Devi accedere o registrarti per scrivere nel forum
1 risposte