java - 通知后控制不返回到等待线程

标签 java multithreading wait

我创建了一个名为 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/

相关文章:

multithreading - 这会使对象线程安全吗?

javascript - 等待弹出窗口javascript

用于将 xsd 转换为 bean/objects 的 Java 库

java - 如何创建pdf文件并在spring boot应用程序的邮件中发送

java - 为什么 Java 集合不删除通用方法?

java - 文件无法在 Java 中打开

java - 将可运行对象传递给线程 - Java

java - 在java中通过线程显示图像序列

python - 在 Python 中 5 秒后停止等待串行响应

android - 在安卓应用中等待