【发布时间】:2012-02-07 18:38:05
【问题描述】:
当线程 1 在线程 2 上调用 wait() 和 join() 方法时,线程 1 会等待线程 2,要么等待一段时间,要么直到线程 2 完成。
如果我们使用这些方法的重载版本,即 wait(long timeout) 和 join(long millis),那么
在等待(长时间超时)的情况下,线程 1 将通过 notify(或 notifyall)变为可运行,甚至发生超时(以先到者为准)。
在 join(long millis) 的情况下,线程 2 将在线程 2 完成或超时发生时变为可运行状态(以先到者为准)。
那么这两种实现有什么区别呢?
我认为是这些:-
- 对于wait(),我们需要锁定我们正在等待的对象。对于 join(),这些不是必需的。
- 执行 wait() 后,线程删除它获得的锁,并在再次运行时重新获得锁。但是加入呢?如果这是从同步块(或方法)执行的,线程是否会在执行 join 后移除锁?
【问题讨论】:
-
答案就在问题中。等待阻塞,直到调用线程被通知。 join 阻塞,直到加入的线程完成。 join 不涉及锁。
标签: java multithreading wait