2013-05-06 5 views
0

Я пытаюсь вызвать функцию wait() на объекте «slp», а затем после того, как 1000 мельниц разбудят его, но вместо сообщения «Закончено ...» я получаю «IllegalMonitorStateException», ошибка, после вызова уведомит()Java: IllegalMonitorStateException on notify()

class Class1 extends Thread{ 

boolean newTxt = false; 
private Sleep slp = null; 

synchronized public void put(Sleep slp) 
{ 
    thus.slp = slp; 
try{ slp.wait();}catch(Exception x){} 

} 
synchronized public void wakeup() 
{ 
    slp.notify(); 
} 
public void run() 
{ 
    while(slp == null); 
    try{ sleep(1000);}catch(Exception x){} 
    wakeup(); 

} 
} 

class Sleep extends Thread { 

Class1 t; 
Sleep(Class1 t) { 
this.t=t; 
} 
public void run() { 
System.out.println("Started"); 
t.put(this); 
System.out.println("Finished after 1000 mills"); 
} 

} 

public class Koord { 

    public static void main(String[] args) { 
    Class1 t = new Class1(); 
Sleep t1 = new Sleep(t); 
t1.start(); 
t.start(); 
} 
} 
+0

Работы, но он показывает сообщение сразу, а не после 1000 мельниц – Dawid

ответ

3

вы должны быть «владельцем монитора объекта», чтобы быть в состоянии назвать notify на it.Your методы все синхронизированные на this и вы notify() на других объектах. Просто позвоните wait() и notify().

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

+0

Итак, что бы я изменил? – Dawid

+0

Я отредактировал свой ответ. – NINCOMPOOP

+1

Это дубликат, возможно, 100 вопросов. –

Смежные вопросы