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)。但为什么结果如此不同?
答案 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);
}