Java notfiyAll () не будит основной поток - PullRequest
0 голосов
/ 15 апреля 2011

Я пытаюсь заставить notifyAll () и wait () работать для другого куска кода. Поэтому я создал новую программу, которая ведет себя аналогично другой программе.

В моей программе основной поток создал отдельный поток, который будет запускать notifyAll () через 20 секунд, а мой основной поток будет ждать 60 секунд. Поэтому у моего основного потока должно быть достаточно времени для вызова wait (), прежде чем отдельный поток вызовет notifyAll (). Но проблема в том, что мой основной поток не просыпается от notifyAll () и ждет полных 60 секунд. Почему это не работает?

Мой код выглядит так:

new Thread(new Runnable(){
    public void run(){
        synchronized (this){
            try{
                this.wait(20000);
                System.out.println("Wait 20 seconds then notify");
                this.notifyAll();
            } catch (Exception e){}
        }
    }
}, "test Thread").start();
System.out.println("started thread");

boolean timeout = false;
System.out.println("Start Waiting");
synchronized (this){
    try{
        this.wait(60000);
        timeout = true;
    } catch(Exception e){
        System.out.println("Did not wait 60 seconds");
    }
}
if (timeout){
    System.out.println("Waited 60 Seconds");
}

И вывод, который я получаю:

started thread
Start Waiting
Wait 20 seconds then notify
Waited 60 Seconds

1 Ответ

4 голосов
/ 15 апреля 2011

wait и notify должны использовать одну и ту же ссылку на объект для работы. в этом случае ваше уведомление использует экземпляр Runnable, а ваше ожидание использует экземпляр основного класса.

Вы можете исправить это, синхронизировавшись с «MainClass.this» в экземпляре Runnable (используя любое имя основного класса).

...