在java开发中,经常会用到Thread.sleep(1000);类似的语句来使线程挂起一段时间,那么底层的逻辑是怎么操作的呢?
问题1:假设现在时间是2022-1-1 8:00:00.000,若是调用了Thread.sleep(1000); 在2022-1-1 8:00:01.000 时,这个线程会不会继续执行?
问题2:Thread.sleep(1000);是挂起了0毫秒,那与去掉这句代码有什么区别?
说起线程,其底层就要了解一下操作系统原理了,操作系统主要使用window和linux,windows中CPU竞争的策略是抢占式的,linux中CPU竞争策略是轮询的。
轮询策略中,所有的线程排成一个队列,操作系统按照它们的顺序,给每个线程分配一段时间,若是时间结束时线程还在运行,则CPU将被剥夺分配给另一个线程;若是在时间片结束前阻塞或结束,则CPU当即切换。当线程用完它的时间片后,被移动到队列的末尾。
抢占式策略中,所有的线程按照优先级排成一个队列,操作系统会把CPU交给优先级最高的线程,当一个线程获得了CPU时间,除非自己放弃使用CPU,否则将完全占用。当线程执行结束或自己挂起后,操作系统会重新计算一次优先级进行排列,然后把CPU交给队列中优先级最高的。

场景说明两种策略,吃蛋糕,一个刀叉(一个CPU),10个小伙伴(10个线程)

linux的轮询策略,每个人上来吃1分钟,时间到了换下一个,最后一个吃完了再从头开始。该种策略不管饥饿程度(优先级)的情况、饭量情况。若有人不饿、饭量小,吃了30秒就吃饱了,可以根操作系统说,吃饱了(Thread.sleep()挂起),于是换下一个。
windows抢占式策略,根据饥饿程度(优先级)的情况、饭量情况进行排列,最前面的人先上来吃,吃到不想吃为止,等这个人吃完了,再重新排列,再让最前面的人上来吃。若有人吃了30秒说不想吃了(Thread.sleep()挂起),操作系统重新计算进行排列。若有人吃了30秒说1小时之内都不要叫我上来吃了,就告诉操作系统,在未来多少毫秒内不参与CPU竞争。

问题1,不一定。因为你告诉操作系统,在未来1000毫秒内不参与CPU竞争,那么1000毫秒过去之后:轮询策略下,这时候也行另一个线程正在使用CPU,那么这时操作系统是不会重新分配CPU的,直到那个线程挂起或结束;抢占式策略下,这时候操作系统正进行CPU分配,那么当前线程也不一定是优先级最高的那个,CPU还是可能被其他优先级高的线程抢占去。
问题2,有。吃蛋糕的场景里,有个女同学的优先级最高(最漂亮),操作系统总是叫她上来吃,而且女同学也非常喜欢吃蛋糕,但又很善良,没吃几口就想,会不会有很饿的同学,那么我就让给他。因此没吃几口就跟操作系统说重新计算一下优先级,在未来0毫秒内不要叫我上来吃了。注意,此时是连同女同学本人也参与计算的,因为0毫秒已经过去了,所有若没有很饿的同学,那么下一次还是她被叫上来吃蛋糕。因此,Thread.sleep(0)的作用,就是“触发操作系统立刻重新进行一次CPU竞争”。竞争的结果也许是当前线程仍然获得CPU控制权,也许会换成别的线程获得CPU控制权。

Java之Thread.sleep()浅析相关推荐

  1. Java数据库连接池--DBCP浅析

    转载自   Java数据库连接池--DBCP浅析 前言对于数据库连接池, 想必大家都已经不再陌生, 这里仅仅设计Java中的两个常用数据库连接池: DBCP和C3P0(后续会更新). 一. 为何要使用 ...

  2. java threadgourp_Java Thread getThreadGroup()方法

    Java Thread getThreadGroup()方法 java.lang.Thread.getThreadGroup() 方法返回此线程所属的线程组.它返回null,如果该线程已经死亡(停止) ...

  3. java 线程 Thread 使用介绍,包含wait(),notifyAll() 等函数使用介绍

    (原创,转载请说明出处!谢谢--http://www.cnblogs.com/linguanh/) 此文目的为了帮助大家较全面.通俗地了解线程 Thread 相关基础知识! 目录: --线程的创建: ...

  4. Java继承Thread类创建多线程

    Java继承Thread类创建多线程 单线程示例 示例,Example01.java public class Example01{public static void main(String[] a ...

  5. Java线程 Thread 的6种状态以及转变过程

    线程的6种状态以及转变: java的线程一共6种状态.具体代码见: java.lang.Thread.State 1 NEW 新建状态 Thread state for a thread which ...

  6. 扩展java.lang.Thread类

    package com.multithread.learning;public class Thread1 extends Thread {private String name;public Thr ...

  7. 异常java.lang.Thread.dumpStack(Unknown Source)

    转自: http://www.blogjava.net/landon/archive/2011/02/27/345265.html 昨天在公司写了一段代码,很简单,就是测试Thread的dumpSta ...

  8. 【java】Thread.start 它是怎么让线程启动的呢

    1.概述 转载:面经手册 · 第19篇<Thread.start() ,它是怎么让线程启动的呢?> 可悲可叹,这个问题,6年了,我才第一次知道. 线程启动分析 new Thread(() ...

  9. 【java】Thread.Sleep 与 Thread.onSpinWait

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

最新文章

  1. FastDFS安装与使用
  2. php 静态扩展,thinkphp5行为扩展实现html静态缓存设置
  3. 7行代码AC——1010 一元多项式求导 (25分)
  4. jQuery 图片轮流展示效果
  5. Oracle SQL性能调整注意事项
  6. 【2.0版本】Capi文档生成帮助类,一键生成WebApi接口说明文档,方法异常处理,模拟请求接口(使用Hplus模版)
  7. flashplayer 10 的 p2p 基础
  8. C# 色系表配色 颜色表 美工必备
  9. Adobe Photoshop Pro CC 2019及类似软件注册
  10. Linux大实验 (图书管理系统)
  11. 主板BIOS中的CSM是什么
  12. 欧洲机器人实验室盘点
  13. 考研政治|马克思主义基本原理
  14. 雅诗兰黛公司宣布晋升Stéphane de La Faverie为集团总裁
  15. java+图片高保真压缩_java对图片进行“高保真”压缩
  16. CVPR 2019 | SPADE 阅读笔记(翻译)
  17. oracle remap schema,oracle 10g DATA PUMP 的REMAP_SCHEMA和REMAP_TABLESPACE的功能
  18. Microsoft Remote Procedure Call Runtime 远程代码执行漏洞(CVE-2022-26809)
  19. Vue常用的内置指令的底层细节分析
  20. LC串联震荡电路谐振频率

热门文章

  1. 单片机c语言 软件抗干扰,单片机软件抗干扰的几种常见方法
  2. selenium模拟12306登录
  3. python3多进程写Kafka异步线程调用接口
  4. WaitForMultipleObjects的疑惑
  5. 首届STAC科创联合大会在成都召开 “开悟” AI平台将成为行业生态基建
  6. 【报告分享】2021百度快消人群洞察-百度营销研究院(附下载)
  7. keil STM32中sct 分散加载文件学习
  8. 51单片机控制小舵机
  9. java 电子围栏_怎么画电子围栏,并进行电子围栏进出判断?
  10. 南大计算机学院在职博士,南京大学双证在职博士