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

Java thread.join触发器thread.wait(),但为什么它不';你不需要线程监视器吗?,java,multithreading,join,monitor,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 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");
}
但使用“thread.join()”替换“thread.wait(0)”不会引发任何异常

难题是 我查询thread.join()源代码:它将转到:

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

这意味着它们都触发了等待(0)。但是为什么结果会如此不同呢?

再看一看源代码,你会发现连接是在按住监视器的同时完成的(同步)。如果你想使用“thread.wait(0)”,你需要将它包装在一个同步的块或方法中

看看:

因此,在您的代码中尝试

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

3ks谢谢你的回复。事实上,我对“为什么加入方法保持监视器”感到困惑?我在源代码中找不到任何同步块“那么你能帮我解决我的难题吗?我再次查询源代码并找到根本原因:公共最终同步的void join(long millis)join方法已同步。因此可以在触发器等待时获取线程的监视器。3ks
    Object o = new Object();
    synchronized (o) {
        o.wait(timeInMS);
    }
    synchronized (thread) {
        thread.wait(0);
    }