调用notify的线程会发生什么?

9
当一个线程调用wait()时,它会被阻塞并等待一些通知。
但我想知道调用notify()的线程会发生什么。当前线程被阻塞,然后在通知点返回执行吗?

2
不清楚你的意思。它只是表示监视器已被通知,然后继续执行。为什么你会期望它阻塞呢?(假设你所说的“当前线程”是指调用notify的线程。) - Jon Skeet
4
notify() 是一个非阻塞调用。它的执行方式与任何其他“普通”语句一样。 - awksp
谢谢Jon和user3580294,这就是我想知道的。 - Murilo
3个回答

10

notify()方法被调用时,当前线程不会受到影响,它会继续运行直到自然结束。

wait()notify() 方法必须在一个 synchronized 上下文中调用。当包含 notify() 调用的 synchronized 块执行完毕后,该锁就可用了,此时另一个线程中包含 wait() 调用的块就可以继续执行了。

调用 notify 只是将等待的线程移到可运行线程池中。一旦锁可用,该线程就可以立即继续执行。


当一个线程调用wait(),然后同一个线程再次运行时,执行点将是wait()点,对吗? - Murilo
谢谢 Rudi!它对我很有帮助。 - Murilo
没问题。很高兴能帮助到你 ;) - Rudi Kershaw
我认为当通知线程完成其关键部分时,“等待”线程在执行顺序上优先于“阻塞”线程,对吗? - stdout

2
Notify不会使当前线程进入休眠状态,只会唤醒等待相同互斥量的其他线程。Notify不会阻塞正在执行的线程,通知方和等待方在此之后会愉快地并发执行。如果有多个线程等待并且您想唤醒它们所有,则需要使用notifyAll。请注意,因为所有线程仍然都在关键部分中,它们将被标记为活动状态,但是每次只能一个一个退出关键块。即使没有等待的线程,Notify也不会阻塞。请注意,这仅代表线程的状态:两个线程都将处于活动状态,但实际指令调度取决于线程数量是否大于CPU数量,如果是,则其中一个线程将在CPU上等待其时间片。

必须调用notifyAll()来通知所有正在等待的线程。简单调用notify()不足以实现此功能。 - Rudi Kershaw
当一个线程调用wait()方法后,再次回到运行状态时,执行点将会回到wait()方法的地方,对吗? - Murilo
1
修复了notifyAll的问题,谢谢。是的,它们将从等待返回,但由于等待发生在同步块中,它们将不得不等待该同步对象锁被释放,一个接一个地退出该块。在http://booxs.biz/EN/java/Threads%20in%20Java.html中,您可以比较等待与阻塞的两种情况。 - Lorenzo Boccaccia

0
  • wait()告诉调用线程放弃监视器并进入休眠状态,直到其他线程进入相同的监视器并调用notify()。
  • notify()唤醒第一个在同一对象上调用wait()的线程。

在理想条件下,当线程完成执行后,会调用notify()以返回到调用线程。 但如果在完成之前使用notify(),则该线程将继续正常执行,直到达到自然结束。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接