一个线程调用后通知会发生什么?

时间:2011-08-01 08:16:15

标签: java multithreading

如果我有T1 T2 T3所有已经调用wait并且在waitset中,如果t4调用notify,据我所知 - T1,T2或T3中的一个将被通知并且可能重新获取锁并从等待返回。 没有收到通知的线程会发生什么?他们还会参加等待吗? 是否必须再次通知他们从wait()返回?

如果T4呼叫全部通知,则获取锁定后,t1 T2 T3中只有一个将从等待返回。在这种情况下,由于所有的T1T2和T3都收到了通知,它们是否会自动尝试获取锁并逐个从等待返回?

4 个答案:

答案 0 :(得分:3)

线程进入RUNNABLE而不是RUNNING状态。这意味着notify()一个线程并不一定意味着它会立即运行。因此,由调度程序决定从RUNNABLE线程池中接下来要运行的是什么。

答案 1 :(得分:2)

对于notify(),其他主题仍将等待另一个notify()来电。

对于notifyAll(),其他线程将只等待获取锁定,一次一个 - 不再需要notify个调用。 (当然,他们需要等待通知线程首先释放锁。)

答案 2 :(得分:2)

  

未收到通知的线程会发生什么?他们还会参加等待吗?是否必须再次通知他们从wait()返回?

是的,他们仍在等待中。必须将通知发送到每个等待的线程。收到通知后,等待的线程将尝试重新获取锁

  

如果T4呼叫全部通知,则获取锁定后,t1 T2 T3中只有一个将从等待返回。在这种情况下,由于所有的T1T2和T3都收到了通知,它们是否会自动尝试获取锁并逐个从等待返回?

不保证T1,T2和T3将对通知信号起作用。但是,是的,所有人都会尝试同时重新获得锁定(只有一个会成功并从等待通话中返回)

确保在等待线程从wait()调用返回后,将wait等待在while循环中以重新检查条件。

这个link很好地概述了何时使用notify()/ notifyAll()

答案 3 :(得分:0)

当一个线程执行notify()时,另一个线程在释放它之前无法获取该锁。在你想唤醒所有线程时使用notifyAll()。

无论你在做什么,我建议你确保在你尝试编写低级等待/通知代码之前,Java中的Concurrency Library已经为你做了。