2016-06-24 3 views
0

En ce moment, je me prépare pour la certification java ocajp 8 et je regarde juste à travers quelques dumps et il dit que le code suivant lance IllegalStateException;IllegalStateException avec wait(), notify()

et le code est below`

void waitForSignal() throws Exception{ 
    Object obj = new Object();  
    synchronized (Thread.currentThread()) { 
     obj.wait();  
     obj.notify();  
    }  
}`  

code précédent est tout ce qu'il a fourni et rien d'autre, pourquoi une exception se pose ici et fait est que je connais peu multithreading. et selon la documentation java

IllegalStateException: Les signaux que la méthode a été invoquée en temps illégal ou déplacé. En d'autres termes, l'environnement Java ou l'application Java n'est pas dans un état approprié pour l'opération demandée.

donc je suppose que wait() ou notify() est invoquée au moment inapproprié ... si je ne me trompe pas pourquoi il est temps illégal et si je me trompe, alors expliquer pourquoi .. exception se

+2

Je crains que le multi-threading en Java ne soit pas quelque chose qui peut être appris par essais et erreurs. (Ou au moins cela prend BEAUCOUP d'essai.) Dans ce cas, le problème est que vous n'avez pas le moniteur de 'obj'. – biziclop

+2

En outre, synchroniser sur un objet Thread est une très mauvaise idée. – biziclop

+1

@biziclop Donc, nous pouvons seulement appeler wait ou notifier sur un objet quand nous avons un verrou sur cet objet mais ici nous avons un verrou sur un objet thread, donc c'est la raison pour l'exception d'illegalstate? corrigez-moi si je me trompe – viru

Répondre

2

Vous ne pouvez pas attendre() sur un objet à moins que le thread actuel ne possède le moniteur de cet objet. Pour ce faire, vous devez synchroniser sur elle:

synchronized (obj) { 

Selon javadoc:

public class IllegalMonitorStateException étend RuntimeException Jetés pour indiquer qu'un fil a tenté d'attendre sur l'écran d'un objet ou d'informer autres threads en attente sur le moniteur d'un objet sans posséder le moniteur spécifié.