thread.join触发thread.wait(),但为什么它不需要线程监视器?

时间:2012-03-26 01:11:59

标签: java multithreading join monitor

    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 个答案:

答案 0 :(得分:2)

再看一下源代码,您会发现在按住监视器的同时完成了连接(同步时)。如果要使用“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);
    }