你真的了解Thread.sleep(0)吗?以及Thread.sleep(1) vs Thread.sleep(0)

简介: 你真的了解Thread.sleep(0)吗?以及Thread.sleep(1) vs Thread.sleep(0)

Thread.sleep(0)

当时看到这么一段代码

Thread.sleep(0);

      我在想,为什么会睡眠0ms,有什么作用,为什么要这样写。带着这样的疑惑,我去搜索了一些相关的文章。

基本上两个声音

sleep(0),让线程让出 CPU 权限,供其他更高优先级的线程执行,此线程从运行中状态转换为就绪状态.

通过调用 Thread.sleep(0) 的目的是为了让 GC 线程有机会被操作系统选中,从而进行垃圾清理的工作。它的副作用是,可能会更频繁地运行 GC,毕竟每 1000 次迭代就有一次运行 GC 的机会,但是好处是可以防止长时间的垃圾收集。

为了更好的论证观点的正确性,我继续去搜索相关文章

搜到这两篇文章:

https://blogs.msmvps.com/peterritchie/2007/04/26/thread-sleep-is-a-sign-of-a-poorly-designed-program/ (发表于07年)

http://joeduffyblog.com/2006/08/22/priorityinduced-starvation-why-sleep1-is-better-than-sleep0-and-the-windows-balance-set-manager/

其中,发表于07年的文章中有这么一段话

       Thread.Sleep 有一种不间断的用法:Thread.Sleep(0)。这告诉系统你想要放弃线程的剩余时间片并让另一个等待的线程运行。如果没有其他线程等待运行,您仍然会放弃您的时间片。如果还有其他线程在等待运行,您将无法确定何时拿回控制权;如果等待的线程具有更高的优先级,您可能永远无法取回控制权。

      Thread.Sleep(0) 有效地告诉操作系统你比它更擅长调度进程,你可能会影响它调度线程和进程的方式,如果你使用 Sleep( 0)很多。

Thread.sleep(1); vs Thread.sleep(0);

Thread.Sleep(n); // Where n is milliseconds

当 n==0

       这告诉系统您想要放弃线程的剩余时间片并让另一个等待线程(其优先级 >= currentThread)运行(这意味着您无法确定何时取回控制权)。如果没有其他同等优先级的线程准备好运行,则不会挂起当前线程的执行。

当n>=1时(无论是n=1还是n=2)

       将阻塞当前线程至少n 毫秒内可能发生的时间片(或线程量程)的数量,换句话说,它将无条件地将其剩余时间片放弃给任何其他线程。

相关文章
|
19天前
|
Java 编译器 UED
Thread.sleep()总结
Thread.sleep()总结
|
2月前
|
监控 算法 Unix
Thread.sleep(0) 到底有什么用
Thread.sleep(0) 到底有什么用
31 1
Thread
Thread方法
42 0
|
调度 C++
Thread.sleep(0) vs Thread.sleep(1) vs Thread.yield() vs Object.wait()
Thread.sleep(0) vs Thread.sleep(1) vs Thread.yield() vs Object.wait()
|
消息中间件 安全 Java
|
Linux Windows
sleep
sleep
103 0
|
安全 Java 中间件
Thread.sleep(0)的作用
在源码中经常能看到sleep(0)的操作,今天来总结下sleep(0)的作用到底是啥
406 0
|
Java Linux 调度
Thread.yield、Thread.sleep、Object.wait、 LockSupport.park 对比
Thread.yield、Thread.sleep、Object.wait、 LockSupport.park 对比
400 0
Thread.yield、Thread.sleep、Object.wait、 LockSupport.park 对比