yield()和sleep()之间有什么区别?

时间:2011-03-14 20:49:03

标签: java multithreading

我知道一个区别:

如果我们说thread.sleep(1000),那个线程肯定会睡眠1000毫秒,而yield()没有这样的保证。这对于线程调度很有用,因为调用yield()的线程可能会立即再次选择运行。

还有什么?

4 个答案:

答案 0 :(得分:13)

Thread.sleep()方法

  1. 当前主题将状态从正在运行更改为正在等待 /已阻止,如下图所示。
  2. 参考当前正在休眠的线程(比如说t)的任何其他线程都可以打断它调用t.interrupt()
    • 必须封装对睡眠的调用以捕获InterruptedException
    • 的已检查异常
  3. 在线程设置为sleep的时间段之后,它将进入Runnable状态,可能不会立即运行!它必须等待线程调度程序为其时间片安排它。
  4. Thread.yield()

    1. 调用它可能会导致线程调度程序将当前线程正在运行移动到 Runnable 状态,并执行另一个相同的优先级线程可运行状态。只有在Runnable状态中存在具有相同优先级的其他线程时,才会发生此状态转换。因此无保证线程将停止执行,因为可能无法满足另一个相同优先级线程的标准。
    2. .yield()很大程度上基于线程优先级概念。 (所有线程都分配了优先级,当优先级较高的线程处于Runnable状态时,它通常会抢占/停止执行较低优先级的线程,具体取决于ThreadScheduler的实现。)
    3. enter image description here 注意:

      • Thread.sleep()Thread.yield()都是静态函数,会影响执行它的当前线程。
      • 这两个函数都不会释放它们持有的同步锁。

答案 1 :(得分:11)

yield只是说:现在是让另一个线程运行并且是调度程序提示的好时机。 sleep确实这样做:至少在给定时间内睡觉。

答案 2 :(得分:3)

yield()暂时暂停当前线程,允许线程调度程序执行具有相同优先级的其他线程。如果没有其他线程在等待或者它们的优先级较低,则生成的线程立即返回执行。

sleep()强制当前线程暂停其执行一段时间。其他等待线程将通过利用此暂停开始执行,即遵循线程调度程序策略 - 其实现依赖于供应商。

答案 3 :(得分:2)

“肯定” - 根据操作系统的线程调度算法,以及优先级更高的优势,您的线程可能需要一个小时才能再次运行线程。

yield()唯一能说的是,“好吧,我已经完成了,所以请随时结束我的时间片并继续执行其他操作。”另一方面,sleep说“用X毫秒唤醒我”。 sleep用于等待,另一个用于给予其他人运行的机会。 他们不是替代品。