等待(长时间超时)和连接(长时间)之间的区别?

时间:2012-01-11 11:48:29

标签: java multithreading join wait

在thread-2上由thread-1调用时,wait()和join()方法都会使thread-1等待某个时间或者直到thread-2完成。

如果我们使用这些方法的重载版本,即wait(长超时)和join(long millis),那么

  1. 在等待(长时间超时)的情况下,thread-1将通过notify(或notifyall)运行,或者甚至发生超时(以先到者为准)。

  2. 在join(long millis)的情况下,当thread-2完成或发生超时时(以先到者为准),thread-2将变为runnable。

  3. 那么这两个实现之间的区别是什么?

    我认为有些是: -

    1. 对于wait(),我们需要锁定我们正在等待的对象。对于join(),这些不是必需的。
    2. 执行wait()之后,线程会删除它获得的锁定,并在锁定再次运行后重新获得锁定。但是加入呢?如果从同步块(或方法)执行此操作,线程是否在执行连接后删除锁?

1 个答案:

答案 0 :(得分:6)

正如你所说,“发布”过程是完全不同的 - 例如它基于notify(),另一个基于完成的线程。他们是完全不同的电话,完全不同的目的。

事实上,在wait()监视器上有明确的警告来调用Thread(尽管我无法立即找到这些警告),因为内部Java代码获取了锁定它们(并使用wait / notify本身)。

但是,如果当前正在执行的线程拥有它,那么在join() 上调用Thread不会释放监视器。

基本上,你根本不应该认为它们相似 - 一个是等待线程终止;另一个是等待合作协调。