2016-06-24 4 views
0

Прямо сейчас, я готовлю сертификацию java ocajp 8 и просто просматриваю несколько дампов, и он говорит, что следующий код вызывает IllegalStateException;IllegalStateException с wait(), notify()

и код below`

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

Предшествующий код все это при условии, и ничего другого, почему здесь возникает исключение и в том, что я знаю немного о многопоточности. и в соответствии с документацией Java

IllegalStateException: Сигналы, что метод был вызван на незаконное или несоответствующее время. Другими словами, среда Java или приложение Java не находятся в соответствующем состоянии для запрошенной операции.

Так я полагаю, ожидание() или уведомить() вызывается в неподходящее время ... если я не ошибаюсь, почему это незаконно время, и если я не прав, то объясните, почему возникает исключение ..

+2

Я боюсь, что многопоточность в Java не является чем-то, что можно узнать с помощью проб и ошибок. (Или, по крайней мере, это требует много проб.) В этом случае проблема в том, что у вас нет монитора 'obj'. – biziclop

+2

Как в стороне, синхронизация по объекту Thread является очень плохой идеей. – biziclop

+1

@biziclop Итак, мы можем вызвать wait или notify на каком-либо объекте, когда у нас есть блокировка на этом объекте, но здесь мы заблокировали какой-то объект потока, так что это причина для unlateexception? исправьте меня, если я ошибаюсь – viru

ответ

2

Вы не можете ждать() объекта, если текущий поток не владеет этим объектом. Чтобы сделать это, необходимо синхронизировать на нем:

synchronized (obj) { 

По Javadoc:

класс IllegalMonitorStateException общественного распространяется RuntimeException Брошенный, чтобы указать, что поток пытается ждать на мониторе объекта или уведомить другие потоки ждут на мониторе объекта, не владея указанным монитором.