写在前面

最近在弄一个传输组件,用到很多多线程的知识,其中有个问题,困扰我很久,不知道是什么原因,脑子一热,在传输过程中,添加了一句代码Thread.Sleep(0)。那个问题竟然解决了,耗费我一上午的时间,一点一点的排查是不是代码逻辑有问题。到最后一句话解决了,兴奋归兴奋,但是为什么这句话就能解决我的问题呢?而且还是睡个0,是不是你也遇到过这种情况?不妨一起讨论下这句神奇的代码!

Thread.Sleep(0)妙解

这里收集了网上的一篇文章,解释的非常有趣,转载在博客中,也推荐给大家一起看看。

[转载]Thread.Sleep(0)妙用

摘录文章的几段话,你也可以有个大概的概念。

操作系统中,CPU竞争有很多种策略。Unix系统使用的是时间片算法,而Windows则属于抢占式的。

  • 在时间片算法中,所有的进程排成一个队列。操作系统按照他们的顺序,给每个进程分配一段时间,即该进程允许运行的时间。如果在 时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则CPU当即进行切换。调度程序所要做的就是维护一张就绪进程列表,当进程用完它的时间片后,它被移到队列的末尾。
  • 所谓抢占式操作系统,就是说如果一个进程得到了 CPU 时间,除非它自己放弃使用 CPU ,否则将完全霸占 CPU 。因此可以看出,在抢占式操作系统中,操作系统假设所有的进程都是“人品很好”的,会主动退出 CPU 。在抢占式操作系统中,假设有若干进程,操作系统会根据他们的优先级、饥饿时间(已经多长时间没有使用过 CPU 了),给他们算出一 个总的优先级来。操作系统就会把 CPU 交给总优先级最高的这个进程。当进程执行完毕或者自己主动挂起后,操作系统就会重新计算一 次所有进程的总优先级,然后再挑一个优先级最高的把 CPU 控制权交给他。

一个例子

例子说明:在控制台中创建两个线程,在线程中分别输出0-100的数字,代码如下:

 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             Thread thchild = new Thread(new ParameterizedThreadStart(Run));
 6             thchild.Start("thread  1 开始");
 7             Thread thchild2 = new Thread(new ParameterizedThreadStart(Run));
 8             thchild2.Start("thread 2 开始");
 9             Console.Read();
10         }
11         static void Run(object obj)
12         {
13
14             for (int i = 0; i < 100; i++)
15             {
16                 Console.WriteLine(obj.ToString() + "\t" + i.ToString());
17                 //Thread.Sleep(0);
18             }
19         }
20     }

测试结果

加上Thead.Sleep(0)测试结果

通过上面两张图的简单对比,有这样一种现象

在没有Thread.Sleep(0)的时候,Thread1和Thread2交换的频率比较低,在使用了Thread.Sleep(0)的时候,Thread1和Thread2交换频率明显增高。

总结

关于Thread.Sleep(0)的详细内容可参考上面转载的那篇文章,觉得介绍的更详细,也比较有趣。当然给的例子,也是一种猜测性质的,系统中跑了那么多的线程,是不是对这个测试结果有干扰,也未可知。也不知道该怎么测试更合适。如果您也遇到过这种情况,不妨留言,讨论一下。

说说Thread.Sleep(0)的那些奇怪的事相关推荐

  1. Thread.sleep(0):线程休眠0秒有什么意义!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:走过路过ボ不要错过 cnblogs.com/keyyang/ ...

  2. Thread.sleep(0) 有什么用?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源 | https://urlify.cn/RnA3ui 我们可 ...

  3. Thread系列——Thread.Sleep(0)

    转载自:http://www.cnblogs.com/ATually/archive/2010/10/21/1857261.html 线程这一概念,可以理解成进程中的一个小单元.这个单元是一个独立的执 ...

  4. 知不知道 Thread.sleep(0) 到底有什么用?

    我们可能经常会用到 Thread.Sleep 函数来吧使线程挂起一段时间.那么你有没有正确的理解这个函数的用法呢? 思考下面这两个问题: 假设现在是 2008-4-7 12:00:00.000,如果我 ...

  5. Thread.Sleep(0) vs Sleep(1) vs Yeild

    文章索引 核心概念 Thread.Yeild       Thread.Sleep(0) Thread.Sleep(1) 实验告诉你:单一线程 实验告诉你:多线程(同优先级) 实验告诉你:多线程(不同 ...

  6. 面试官:Thread.sleep(0) 有什么用?

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"加群",加入新技术 我们可能经常会用到 Thread.Sleep 函数来吧使线程挂起一 ...

  7. Thread.yield()和Thread.sleep(0)

    关于Thread.yield()和Thread.sleep(0)的语义问题真是一个让人挠头的问题,翻了好多资料,在java6语言规范中看到了一段这样的描述: 重点在红框中,简而言之就是:sleep(0 ...

  8. 【java】Thread.Sleep(0) 与 Thread.onSpinWait

    1.概述 转载:Thread.Sleep 与 Thread.onSpinWait 2. Thread.Sleep 一般情况下,我们让线程等待一段时间都是使用Thread.sleep()命令.比如下面这 ...

  9. Thread.sleep(0)到底是个什么骚操作?

    点击上方"Java基基",选择"设为星标" 做积极的人,而不是积极废人! 每天 14:00 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java ...

最新文章

  1. Verilog 中的 ^ 的用法
  2. c#_List<T>(IEnumerable<T>)
  3. 如何获取js对象的对象名
  4. mysql 存储 结构,mysql目录与存储结构(一)
  5. OleDb执行Oracle带自定义函数的SQL深度历险
  6. Ubuntu系统下桌面卡死,但是鼠标键盘可以动
  7. 漫游Kafka设计篇之数据持久化
  8. 入门训练 Fibonacci数列 c语言
  9. mysql怎样修改my ini_mysql修改my.ini报错怎么办
  10. CommonJs、AMD、CMD模块化规范
  11. 我们应该如何保护用户的密码
  12. SGU 201 Non Absorbing DFA (DP)
  13. 二维vector初始化大小方法
  14. UI自动化报错Can not connect to the Service解决方案
  15. LoadRunner11代理在Win10操作系统启动不起来,或者报错:该内存不能为written
  16. 移植鸿蒙系统到STM32L476RG_NUCLEO开发板的一点小经验
  17. 什么是CI/CD?它们与敏捷开发和devops的关系?
  18. 中国互联网惊呆老外?微信大数据揭露“无现金”真相
  19. 查看cbr vbr_如何在口径中查看CBR和CBZ漫画书
  20. 【CANopen】CAN总线的高级协议详解

热门文章

  1. 读文件 —— 读写配置文件
  2. 渣渣菜鸡的 ElasticSearch 源码解析 —— 启动流程(上)
  3. eclipse的操作
  4. 关于offsetTop offsetHeight clientHeight scrollHeight scrollTop的区别研究
  5. machine learning(15) --Regularization:Regularized logistic regression
  6. vmware开发包之vSphere Management SDK
  7. Linux服务器中实现文件夹可写不可删除
  8. 人脸识别技术大总结(1)——Face Detection Alignment
  9. 【DeepLearning工具】Fedora下安装theano
  10. Vue中的基础过渡动画原理解析