“嗨,阿米戈!”

“现在我将告诉您一些有关睡眠、屈服和加入方法的信息。”

“真无聊。我刚找到一道面试题:‘ yield ()、sleep ()、wait ()方法有什么区别?’。你能解释一下吗?”

“没问题,首先,这是三种完全不同的方法。”

1) sleep(timeout)  – 停止当前线程(调用 sleep 的线程)超时参数指示的毫秒数。然后线程进入 TIMED_WAITING 状态。如果设置了 isInterrupted 标志,该方法可能会提前结束。

例子 描述
Thread.sleep(500);
当前线程暂停它自己的执行 500 毫秒,或 0.5 秒。

2) yield()  ——当前线程“跳过它的回合”。线程从运行状态进入就绪状态,JVM 进入下一个线程。running 和 ready 状态是RUNNABLE状态的子状态。

例子 描述
Thread.yield();
当前线程“跳转”,Java 立即切换到下一个线程。

3) wait(timeout)  – 这是wait () 方法的一个版本,但有超时。“只能在当前线程锁定的互斥对象上的同步块内调用wait方法。否则,该方法将抛出非法MonitorState异常。

“调用此方法会导致互斥锁对象的锁被释放,使其可供另一个线程获取。此外,线程进入 WAITING 状态(对于不带参数的 wait() 方法)或 TIMED_WAITING 状态(对于 wait(timeout ) 方法)。”

例子 描述
Object monitor = getMonitor();
synchronized(monitor)
{
 …
 monitor.wait(500);
 …
}
当wait方法被调用时,当前线程释放monitor对象的锁,并休眠500毫秒。监视器对象可以被另一个线程获取。
500 毫秒后,线程将被唤醒,如果监视器不忙,线程将获取它并继续工作。
如果监视器被另一个线程锁定,则当前线程将切换到 BLOCKED 状态。

4)加入(超时)

“这个方法不在你的问题中,但它在我的课程计划中,所以我会告诉你它。当你调用 join() 或 join(timeout) 方法时,当前线程被“附加”到线程它调用了这个方法。当前线程进入睡眠状态并等待它连接到的线程完成(即调用其 join() 方法的线程)。

“当前线程进入 join() 方法的 WAITING 状态和 join(timeout) 方法的 TIMED_WAITING 状态。”

例子 描述
Thread thread = getWorkThread();
thread.join(500);
当前线程会加入workerThread线程,等待它结束。
但它将在 500 毫秒后“脱离”并继续运行。

“wait(timeout) 和 join(timeout) 方法中的超时意味着该方法进入睡眠状态并等待某事,但不会超过以毫秒为单位的超时时间。然后它会醒来。”

“看起来这些方法唯一的共同点就是超时。它们做的事情完全不同。”

“对,没错。”