点击上方“Java基基”,选择“设为星标”

做积极的人,而不是积极废人!

每天 14:00 更新文章,每天掉亿点点头发...

源码精品专栏

  • 原创 | Java 2021 超神之路,很肝~

  • 中文详细注释的开源项目

  • RPC 框架 Dubbo 源码解析

  • 网络应用框架 Netty 源码解析

  • 消息中间件 RocketMQ 源码解析

  • 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析

  • 作业调度中间件 Elastic-Job 源码解析

  • 分布式事务中间件 TCC-Transaction 源码解析

  • Eureka 和 Hystrix 源码解析

  • Java 并发源码

来源:blog.csdn.net/M283592338/

article/details/106819349

  • 操作系统资源的分配策略

  • 关于Sleep

  • 总结


今天看到一段有意思的代码:Thread.sleep(0),下面就来分析一下这串看似无用的代码到底有没有用。

Thread.sleep(0)到底是个什么骚操作,这睡0毫秒和不睡有什么区别吗?

操作系统资源的分配策略

想要去了解多线程,就先要去了解操作系统中资源的不同分配策略。在操作系统中,CPU资源的分配策略有多种,下面就拿两种最为典型的策略举例:

时间片算法

基于时间片算法分配资源的代表就是Unix系统。在时间片算法中,操作系统会维护一个队列,将所有的进程放入队列中。然后操作系统会按照队列中的进程顺序为他们分配属于自己的运行时间 ,也就是说,操作系统给A进程分配n毫秒时间,那么A进程在本次排队时只可以运行n毫秒。

当A进程运行完n毫秒后,操作系统不管A是否运行完毕都会把运行权限强行剥夺,交给队列里面的下一个进程去执行,然后A进程继续去队列尾部进行下一次排队。(这里,如果A在n毫秒之前提前结束或者被阻塞,操作系统会立即收回A的运行权限)

举个例子:

你去食堂买饭,这种模式就是食堂会强制你去排队,而且每人只有十分钟点餐时间,一旦过了这个时间你就要重新去排队。

抢占式

基于抢占式分配资源的代表是Winodws系统。抢占式的操作系统都是“儒家学派”的,默认每个进程都是“君子”。意思就是:一个进程一旦拿到CPU后,除非它主动放弃CPU权限,不然别的进程是拿不到CPU权限的。

然后操作系统在选取执行权限的时候也不是随机选的,它会根据优先级和饥饿时间来判定谁更需要CPU权限的。每次一个进程是释放CPU后,就会进行一次优先级评定。也就是说,如果运气好,每次都会被选中。

举个例子:

你去食堂买饭,食堂阿姨看你小伙子挺帅就先给你盛饭。然后给你盛完饭再选一次,又发现你这小伙子越看越顺眼,就再给你一碗。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

关于Sleep

拿抢占式来说。去食堂吃饭,阿姨看小伙子挺不错,三番五次的给你盛饭,但是你已经吃饱了,这时候你就会告诉阿姨我吃饱了,接下来半小时不要再给我盛饭了。

对应到代码里就是,A最近30min不想再参与资源选举了,这时它就会sleep(30 * 60 * 1000),然后操作系统就会进行再次选举,并且未来半小时A不参与选举。此时当A醒来之后,或许CPU执行权在另一个进程手里。

再说Thread.sleep(0)

假如A执行了一段时间后,突然想起来其他小伙伴可能也需要CPU执行权限,不能光自己一个人霸占这个CPU,但是又没办法主动申请再次选举,就只能退而求其次执行Thread.sleep(0),在A有执行权限的情况下执行,执行后告诉操作系统,我要休息0毫秒,你接下来0毫秒内的选举就不要选我啦。但是操作系统下次再选举的时候还是会把A算进去,因为0毫秒已经过了。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud

  • 视频教程:https://doc.iocoder.cn/video/

总结

Thread.sleep(0)不光有用,而且有奇效,对于想做老好人的进程可以调用一次,让操作系统再次进行选举。



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢

已在知识星球更新源码解析如下:

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 6W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)

Thread.sleep(0)到底是个什么骚操作?相关推荐

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

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

  2. 你没玩过的全新版本!Win10这些骚操作你知多少

    你没玩过的全新版本!Win10这些骚操作你知多少 [PConline技巧]不知不觉,Win10与我们相伴已经整整四个年头了,从最开始的组团抗拒到现在的默默接受,个中滋味相信谁心里都有个数.近日微软开始 ...

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

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

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

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

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

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

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

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

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

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

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

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

  9. php中的eq的含义,jquery,_jQuery中的eq(0)到底是什么意思??详情请看下面代码!,jquery - phpStudy...

    jQuery中的eq(0)到底是什么意思??详情请看下面代码! 手风琴效果 *{padding:0; margin:0;} .box{margin:50px auto; width:300px; he ...

最新文章

  1. 打印show attend and tell的解码器网络结构
  2. map,存储多个键值对的数据集合
  3. ubuntu升级python_Ubuntu 系统下可以做什么?——拥抱自由和安静
  4. Spring配置中的classpath:与classpath*:的区别研究
  5. git commit命令
  6. Java Class 文件结构
  7. 零基础带你学习MySQL—流程控制函数(十七)
  8. 《nftables相比iptables到底改变了什么》-- (作者:blog.csdn.net/dog250)
  9. java hash简易_Java手写简易版HashMap的使用(存储+查找)
  10. matlab求动力学模型,MATLAB/Simulink动力学系统建模与仿真(带目录)_IT教程网
  11. ad中那个快捷键是重复上一部_PPT中十大快捷键
  12. linux 内核网络中 RPS/RFS 原理Ⅰ
  13. MySQL更新时间的时候生成随机时间
  14. 信号的扩展是因果_信号与系统 怎么判断e(1-t)的时不变和因果性?
  15. 【USACO】山峰暸望
  16. 《十》浏览器基础及渲染引擎解析一个网页的过程、JavaScript 引擎解析 JavaScript 代码的过程
  17. 2019 ICCV之多光谱行人检测:Weakly Aligned Cross-Modal Learning for Multispectral Pedestrian Detection
  18. CCFL、WLED、RGB LED背光液晶屏优缺点
  19. matlab double to int,如何将matlab中的sym数据类型转换为double型
  20. 如何提取多元回归lm里面的全模型的R2和p值

热门文章

  1. java计算机毕业设计在线影视系统源码+数据库+lw文档+系统+部署
  2. 超详细的VsCode创建SpringBoot项目(图文并茂)
  3. 修改oracle nls_language
  4. 使用 tcpcopy 线上导流及回放
  5. 计算机组成原理常见题(四)
  6. label 中的for属性有什么用
  7. 简历制作案例分析及制作小技巧总结
  8. %在c语言中起什么作用
  9. python3图片处理(笔记)
  10. 写一些我工作中遇到的问题吧