Thread.join запускает thread.wait (), но почему ему не нужен мониторинг потоков? - PullRequest
2 голосов
/ 26 марта 2012
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                TimeUnit.SECONDS.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    });

    thread.start();
    try {
        thread.wait();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    System.out.println("end");
}

это предложение выкинет:

    Exception in thread "main" java.lang.IllegalMonitorStateException 
at java.lang.Object.wait(Native Method)

но используйте "thread.join ()" для замены "thread.wait (0)" не выдает никакого исключения.

Загадка Я запрашиваю исходный код thread.join (): он пойдет по адресу:

while(isAlive) 
wait(0);

это означает, что они оба вызывают ожидание (0). но почему результат так отличается?

1 Ответ

2 голосов
/ 26 марта 2012

Посмотрите еще раз на исходный код, и вы увидите, что соединение выполнено, удерживая монитор (при синхронизации).Если вы хотите использовать «thread.wait (0)», вам нужно обернуть его в синхронизированный блок или метод.

Посмотрите: http://docs.oracle.com/javase/tutorial/essential/concurrency/guardmeth.html

    Object o = new Object();
    synchronized (o) {
        o.wait(timeInMS);
    }

и так в вашем коде попробуйте

    synchronized (thread) {
        thread.wait(0);
    }
...