我创建了一个名为ThreadA
的新线程,并在主线程中启动了它。
我等待在ThreadA
完成一些操作。
经过一些操作后,我使用notify
发送了通知。
但是主线程中wait
下面的代码没有被调用,它等待ThreadA
的整个代码完成。
是线程的本质还是线程获取运行问题的访问权限?
Job job = new MyJob();
job.schedule();
synchronized(job) {
job.wait();
sysout("After notify");
}
这里job
是org.eclipse.core.runtime.jobs
内部作业运行方法:
run {
synchronized(this) {
step 1();
notify();
step 2();
}
}
这里第2步是大代码。
答案 0 :(得分:1)
通知线程在释放锁之前实际上不会发送通知。您需要在通知发生之前释放锁定,并且您的代码没有这样做。
然后,接收通知的线程当然没有锁。它必须在它可以动作之前获取锁,如果线程正在等待它需要获取锁,然后才能退出wait方法。通知线程没有偏好,也没有理由认为必须首先采取行动。
这是为什么建议总是在循环中调用wait的部分原因,你不会这样做。唤醒线程一旦获得锁定,应该检查它被唤醒的状态是否仍然是真的。
您的Job run方法一直保持锁定,从调用step1到调用step2。为了让通知的线程对通知做任何事情,它必须停止等待,这需要在它退出wait方法之前重新获取锁(因为它必须进入它自己的synchronized块)。这意味着在通知线程释放锁之前发送通知是没有意义的,因为无论如何等待线程都无法做到这一点。