通知

时间:2016-08-02 13:31:25

标签: 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步是大代码。

1 个答案:

答案 0 :(得分:1)

通知线程在释放锁之前实际上不会发送通知。您需要在通知发生之前释放锁定,并且您的代码没有这样做。

然后,接收通知的线程当然没有锁。它必须在它可以动作之前获取锁,如果线程正在等待它需要获取锁,然后才能退出wait方法。通知线程没有偏好,也没有理由认为必须首先采取行动。

这是为什么建议总是在循环中调用wait的部分原因,你不会这样做。唤醒线程一旦获得锁定,应该检查它被唤醒的状态是否仍然是真的。

您的Job run方法一直保持锁定,从调用step1到调用step2。为了让通知的线程对通知做任何事情,它必须停止等待,这需要在它退出wait方法之前重新获取锁(因为它必须进入它自己的synchronized块)。这意味着在通知线程释放锁之前发送通知是没有意义的,因为无论如何等待线程都无法做到这一点。