为什么是wait()
and notify()
中声明的方法Object
类,而不是Thread
class?
因为,您等待给定的对象(或者具体来说,它的监视器)来使用此功能。
我认为您可能误解了这些方法的工作原理。它们不只是处于线程粒度级别,即not只是打电话的情况wait()
并被下一个电话唤醒notify()
。相反,你总是打电话wait()
在一个特定的对象上,并且只会被调用唤醒notify
在那个物体上.
这很好,因为否则并发原语就无法扩展;它相当于拥有全局名称空间,因为任何对notify()
程序中的任何地方都有可能搞砸any并发代码,因为它们会唤醒阻塞在wait()
称呼。因此,您在特定对象上调用它们的原因;它为等待通知对提供了操作的上下文,因此当您调用myBlockingObject.notify()
,在私有对象上,您可以确定只会唤醒类中调用 wait 方法的线程。某些可能正在等待另一个对象的 Spring 线程将不会被此调用唤醒,反之亦然。
编辑:或者从另一个角度解决它 - 我希望从你的问题中你认为你会得到等待线程的句柄并调用notify()
on 那个线程来唤醒它。不这样做的原因是你必须自己做很多家务活。要等待的线程必须在其他线程可以看到的地方发布对自身的引用;这必须正确同步以增强一致性和可见性。当您想要唤醒一个线程时,您必须获取该引用,唤醒它,然后将其从您读取它的位置中删除。与仅调用相比,涉及更多的手动脚手架,并且出错的可能性更大(特别是在并发环境中)myObj.wait()
在睡眠线程中然后myObj.notify()
在唤醒线程中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)