在thread-2上由thread-1调用时,wait()和join()方法都会使thread-1等待某个时间或者直到thread-2完成。
如果我们使用这些方法的重载版本,即wait(长超时)和join(long millis),那么
在等待(长时间超时)的情况下,thread-1将通过notify(或notifyall)运行,或者甚至发生超时(以先到者为准)。
在join(long millis)的情况下,当thread-2完成或发生超时时(以先到者为准),thread-2将变为runnable。
那么这两个实现之间的区别是什么?
我认为有些是: -
答案 0 :(得分:6)
正如你所说,“发布”过程是完全不同的 - 例如它基于notify()
,另一个基于完成的线程。他们是完全不同的电话,完全不同的目的。
事实上,在wait()
监视器上有明确的警告不来调用Thread
(尽管我无法立即找到这些警告),因为内部Java代码获取了锁定它们(并使用wait
/ notify
本身)。
但是,如果当前正在执行的线程拥有它,那么在join()
上调用Thread
不会释放监视器。
基本上,你根本不应该认为它们相似 - 一个是等待线程终止;另一个是等待合作协调。