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);
}