Ecco un caso in cui un thread è in attesa di notify() o di un timeout. Qui viene aggiunto un ciclo while per gestire la sveglia spuria.Java: Come distinguere tra wakeful spurio e timeout in attesa()
boolean dosleep = true;
while (dosleep){
try {
wait(2000);
/**
* Write some code here so that
* if it is spurious wakeup, go back and sleep.
* or if it is timeout, get out of the loop.
*/
} catch (InterruptedException e) {
e.printStackTrace();
}
}
In questo caso come posso distinguere tra un risveglio spuria e time out? Se si tratta di una sveglia spuria, ho bisogno di tornare indietro e aspettare. E se è un timeout, ho bisogno di uscire dal giro.
Posso facilmente identificare il caso di notify(), perché imposterò la variabile dosleep su false durante la chiamata a notify().
EDIT: sto usando la versione 1.4 java, a causa dei requisiti del progetto incorporato. Non riesco a utilizzare Condition
dato che è disponibile solo per il post 1.5.
Grazie in anticipo.
Bringer128 ha una soluzione ragionevole, ma, mi chiedo perché vuoi farlo. L'Interrupt non è generalmente un "wakeful spurio", è un segnale per interrompere e _ fermare il processo. – user949300
Non si tratta di interrupt. Un "wakeful spurio" può venire in qualsiasi momento. Se arriva nello stesso tempo dopo che sono entrato nell'attesa(), non voglio uscire dal ciclo allora. Ho bisogno di aspettare che attendo il tempo di timeout prima di uscire dal ciclo –
che vedo. Non ti stai interrompendo, ma qualche altro thread sta chiamando notify() o, più probabilmente, notifyAll(), e ti sei svegliato. – user949300