我创建了一个名为 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 步是大代码。
最佳答案
通知线程在释放锁之前实际上并不发送通知。您需要在通知发生之前释放锁,而您的代码没有这样做。
那么接收通知的线程当然没有锁。它必须先获取锁才能执行操作,如果线程正在等待,则需要获取锁才能退出 wait 方法。对于被通知的线程没有偏好,也没有理由认为它必须首先采取行动。
这就是为什么建议始终在循环中调用 wait 的部分原因,而您却没有这样做。唤醒线程在获得锁后应检查其被唤醒的条件是否仍然成立。
您的作业运行方法从调用步骤 1 到调用步骤 2 一直保持锁定。为了让被通知的线程对通知执行任何操作,它必须停止等待,这需要在退出 wait 方法之前重新获取锁(因为它必须进入自己的同步块(synchronized block))。这意味着在通知线程释放锁之前发送通知是没有意义的,因为等待线程对此无能为力。
关于java - 通知后控制不返回到等待线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38721910/