当线程 1 在线程 2 上调用 wait() 和 join() 方法时,线程 1 会等待线程 2,一段时间或直到线程 2 完成。
如果我们使用这些方法的重载版本,即 wait(long timeout) 和 join(long millis),那么
在 wait(long timeout) 的情况下,thread-1 将通过notify(或notifyall)变得可运行,甚至发生超时(以先到者为准)。
在 join(long millis) 的情况下,当 thread-2 完成或发生超时(以先到者为准)时,thread-2 将变得可运行。
那么这两种实现方式有什么区别呢?
我认为的一些是:-
- 对于 wait(),我们需要锁定正在等待的对象。对于 join() 来说,这些不是必需的。
- 执行 wait() 后,线程会删除它所获得的锁,并在再次运行时重新获得锁。但是加入呢?如果这是从同步块(或方法)执行的,那么线程在执行 join 后是否会删除锁?
正如你所说,“发布”过程是完全不同的 - 在一种情况下(等待)它基于notify()
,另一个(join)是基于线程完成的。它们是完全不同的调用,具有完全不同的目的。
事实上,有明确的警告not打电话wait()
on Thread
监视器(尽管我无法立即找到这些警告),因为内部 Java 代码获取它们的锁(并使用wait
/notify
本身)。
但不,打电话join()
on Thread
doesn't如果当前正在执行的线程拥有监视器,则释放该监视器。
基本上,你不应该认为它们是相似的——一个是等待线程终止;另一个是等待线程终止。二是等待合作协调。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)