你真的了解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 毫秒内可能发生的时间片(或线程量程)的数量,换句话说,它将无条件地将其剩余时间片放弃给任何其他线程。

相关文章
|
缓存 编译器
BOLT 二进制反馈优化技术
大型应用的代码往往达到数十甚至上百MB,这导致在程序执行时缓存机制无法充分利用,导致大量时间花费在CPU和内存链路上。通过对热点函数的布局进行优化,我们可以更好地利用CPU cache,从而获得较为可观的性能提升。针对这一问题,在编译技术上有PGO和Bolt两种解决办法,两者都是一种通过收集程序在运行时如跳转,调用关系,函数热度等执行信息,这些收集到的程序运行情况数据(profile data),可以更好地指导一些程序优化的策略,如是否对函数进行内联,以及对基本块和函数布局的排布来提高特定场景下的程序性能。
2545 2
BOLT 二进制反馈优化技术
|
Java 编译器 UED
Thread.sleep()总结
Thread.sleep()总结
1039 0
|
12月前
|
机器学习/深度学习 人工智能 图形学
如何将图形学先验知识融入到人工智能模型中?
如何将图形学先验知识融入到人工智能模型中?
301 94
|
12月前
|
Java C# Python
线程等待(Thread Sleep)
线程等待是多线程编程中的一种同步机制,通过暂停当前线程的执行,让出CPU时间给其他线程。常用于需要程序暂停或等待其他线程完成操作的场景。不同语言中实现方式各异,如Java的`Thread.sleep(1000)`、C#的`Thread.Sleep(1000)`和Python的`time.sleep(1)`。使用时需注意避免死锁,并考虑其对程序响应性的影响。
279 8
|
机器学习/深度学习 前端开发 数据可视化
数据分析web可视化神器---streamlit框架,无需懂前端也能搭建出精美的web网站页面
数据分析web可视化神器---streamlit框架,无需懂前端也能搭建出精美的web网站页面
1054 0
|
监控 算法 Unix
Thread.sleep(0) 到底有什么用
Thread.sleep(0) 到底有什么用
109 1
|
NoSQL 关系型数据库 MySQL
黑马点评笔记 redis实现优惠卷秒杀(一)
黑马点评笔记 redis实现优惠卷秒杀
363 0
|
计算机视觉 Python
OpenCV图像处理-图片拼接(Python)
1. 图片拼接原理 对于图像拼接主要分为两部分:1.特征点匹配,确定两幅图之间的位置关系;2.把所有图像投影变换到同一坐标系,并完成对接与融合。
513 0
|
Java
java-线程等待/同步的五种方法
在面试时,经常会有面试官问道,一个主线程有多个子线程,如何能使子线程的业务执行完成之后,再执行主线程业务逻辑。对于这个问题,本人能够想到的有五种方法,详细请移步源码 1、使用线程类自带的join方法,将子线程加入到主线程,在子线程执行完之后,在执行主线程逻辑。
1767 0
|
Unix Shell Docker
部署Fabric遇到问题和解决方法总结
Fabric遇到问题和解决方法总结
561 1
部署Fabric遇到问题和解决方法总结
下一篇
开通oss服务