【问题标题】:Difference between wait(long timeout) and join(long millis)?等待(长超时)和加入(长毫秒)之间的区别?
【发布时间】:2012-02-07 18:38:05
【问题描述】:

当线程 1 在线程 2 上调用 wait() 和 join() 方法时,线程 1 会等待线程 2,要么等待一段时间,要么直到线程 2 完成。

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

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

  2. 在 join(long millis) 的情况下,线程 2 将在线程 2 完成或超时发生时变为可运行状态(以先到者为准)。

那么这两种实现有什么区别呢?

我认为是这些:-

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

【问题讨论】:

  • 答案就在问题中。等待阻塞,直到调用线程被通知。 join 阻塞,直到加入的线程完成。 join 不涉及锁。

标签: java multithreading wait


【解决方案1】:

正如你所说,“释放”过程是完全不同的——在一种情况下(等待)它基于notify(),另一种情况(加入)它基于线程完成。它们是完全不同的调用,用于完全不同的目的。

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

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

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

【讨论】:

    猜你喜欢
    • 2020-04-06
    • 2021-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-09
    • 2011-03-24
    • 2020-08-24
    相关资源
    最近更新 更多