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

Bhu*_*han 6 java multithreading

我知道一个区别:

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

还有什么?

fri*_*ley 14

Thread.sleep()方法

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

Thread.yield()

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

在此输入图像描述 注意:

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


Dar*_*ust 12

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