为什么wait()
和notify()
方法在Object
类中声明,而不是在Thread
类中声明?
发布于 2009-11-20 18:13:15
最简单和最明显的原因是,任何对象(不仅仅是线程)都可以作为线程的监视器。等待和通知是在监视器上调用的。正在运行的线程检查监视器。因此,等待和通知方法位于Object中,而不是Thread中
发布于 2009-11-20 18:11:56
因为一次只能有一个线程拥有一个对象的监视器,而这个监视器是线程正在等待或通知的。如果您阅读了Object.notify()
和Object.wait()
的javadoc,就会对其进行详细描述。
发布于 2009-11-20 20:06:27
同步机制涉及到对象的概念监视器。当调用wait()时,将请求监视器,并挂起进一步的执行,直到获得监视器或发生InterruptedException。当notify()被调用时,监控器被释放。
让我们来看一个场景,如果wait()和notify()被放在Thread类而不是Object类中。在代码中的某一点上,调用currentThread.wait()
,然后访问对象anObject
。
//.........
currentThread.wait();
anObject.setValue(1);
//.........
当调用currentThread.wait()时,将请求currentThread
的监视器,并且在获取监视器或发生InterruptedException之前不会执行进一步的操作。现在处于等待状态,如果从另一个线程调用驻留在currentThread
中的另一个对象anotherObject
的方法foo()
,即使被调用的方法foo()
不访问anObject
,它也会被卡住。如果第一个wait()方法是在anObject
上调用的,而不是线程本身,那么驻留在同一线程中的对象上的其他方法调用(不访问anObject
)就不会被卡住。
因此,在Object类(或其子类)上调用wait()和notify()方法可以提供更大的并发性,这就是为什么这些方法位于Object类中,而不是Thread类中。
https://stackoverflow.com/questions/1769489
复制相似问题