前言

讨论这个问题前,需要先了解以下知识点!

1、等待/阻塞队列(blocked)中的线程不参与cpu竞争,就绪队列(runable)中的线程才会参与cpu竞争。
2、CPU竞争策略有多种,Unix使用的是时间片算法,Windows属于抢占式。

a)时间片:
所有的进程排成一个队列。操作系统按照他们的顺序,给每个进程分配一段时间,即允许该进程运行的时间。

b)抢占式操作系统
就是说如果一个进程得到了 CPU 时间,除非它自己放弃使用 CPU ,否则将完全霸占 CPU 。因此可以看出,在抢 占式操作系统中,操作系统假设所有的进程都是“人品很好”的,会主动退出 CPU 。

一、sleep(0)发生了什么

它会让操作系统就会重新计算队列中所有线程的优先级,其中本身也参与其中,并且有可能再次获取被CPU运行。
简单是说:它触发操作系统立刻按优先级,重新进行一次CPU竞争。

二、sleep(1)

它会在极短的1毫秒内进入睡眠(被放入等待队列中,进入等待状态,暂时放弃CPU竞争),1毫秒后立刻又再次参与CPU的竞争。

三、sleep(1000)

告诉操作系统:在未来的1000毫秒内不再参与到CPU竞争,1000毫秒后重新参与竞争,有可能竞争成功(因为有优先级的存在)。
在此1000毫秒内,线程被放入等待队列中,直到中间被打断或者结束1000毫秒后,才会进入就绪队列中,继续参与cpu竞争。

总结

三者都使用了参数,只是睡眠的时间长短不一样。如果单单从睡眠时间结束后的结果来看,三者的作用是一样的,都是不释放锁,都是睡醒后重新同其他线程竞争CPU的执行权,问题就出在0、1、1000,这段时间发生了什么。

0,意味着没有休息,离开进入下一轮的CPU执行权竞争中,可能竞争成功也可能失败。

1,是一样的,仅仅是休息1毫秒后,立刻进入下一轮的竞争,仅仅是在这1毫秒内进入了等待状态。

1000,相对于1,此时的1000就不难理解了,它仅仅是休息的时间(放弃竞争CPU执行权)的时间更长。

尾言

学好多线程,这些都是绕不过去的点,只能深挖后一个一个突破,加油!

猜你可能会对以下内容感兴趣:

1、JAVA多线程:synchronized理论和用法 | Lock和ReentrantLock Volatile 区别和联系(一)

2、JAVA多线程:yield/join/wait/notify/notifyAll等方法的作用(二)

3、 JAVA多线程:join()方法到底会不会释放锁,给你彻底介绍清楚(三)

JAVA多线程:sleep(0)、sleep(1)、sleep(1000)的区别(四)相关推荐

  1. java 多线程 最优_Java多线程与并发系列从0到1全部合集,强烈建议收藏!

    在过去的时间中,我写过Java多线程与并发的整个系列. 为了方便大家的阅读,也为了让知识更系统化,这里我单独把Java多线程与并发的整个系列一并罗列于此,希望对有用的人有用,也希望能帮助到更多的人. ...

  2. Java多线程常见面试题及答案汇总1000道(春招+秋招+社招)

    Java多线程面试题以及答案整理[最新版]Java多线程高级面试题大全(2021版),发现网上很多Java多线程面试题都没有答案,所以花了很长时间搜集,本套Java多线程面试题大全,汇总了大量经典的J ...

  3. Java多线程与并发系列从0到1全部合集,强烈建议收藏!

    在过去的时间中,我写过Java多线程与并发的整个系列. 为了方便大家的阅读,也为了让知识更系统化,这里我单独把Java多线程与并发的整个系列一并罗列于此,希望对有用的人有用,也希望能帮助到更多的人. ...

  4. Java多线程编程实战:模拟大量数据同步

    背景 最近对于 Java 多线程做了一段时间的学习,笔者一直认为,学习东西就是要应用到实际的业务需求中的.否则要么无法深入理解,要么硬生生地套用技术只是达到炫技的效果. 不过笔者仍旧认为自己对于多线程 ...

  5. Java多线程学习处理高并发问题

    在程序的应用程序中,用户或请求的数量达到一定数量,并且无法避免并发请求.由于对接口的每次调用都必须在返回时终止,因此,如果接口的业务相对复杂,则可能会有多个用户.调用接口时,该用户将冻结. 以下内容将 ...

  6. Java多线程发展简史

    摘自: http://www.raychase.net/698 这篇文章,大部分内容,是周五我做的一个关于如何进行Java多线程编程的Knowledge Sharing的一个整理,我希望能对Java从 ...

  7. java多线程 生产者消费者_java多线程之-生产者与消费者

    java多线程之-并发协作[生产者与消费者]模型 对于多线程程序来说,不管c/c++ java python 等任何编程语言,生产者与消费者模型都是最为经典的.也就是可以说多线程的并发协作 对于此模型 ...

  8. java多线程中的join方法详解

    java多线程中的join方法详解 方法Join是干啥用的? 简单回答,同步,如何同步? 怎么实现的? 下面将逐个回答. 自从接触Java多线程,一直对Join理解不了.JDK是这样说的:join p ...

  9. Java总结篇系列:Java多线程(三)

    2019独角兽企业重金招聘Python工程师标准>>> 本文主要接着前面多线程的两篇文章总结Java多线程中的线程安全问题. 一.一个典型的Java线程安全例子 public cla ...

最新文章

  1. Java学习总结:43(转换流)
  2. 杭电 1711 Number Sequence 1686 2203
  3. Zookeeper知识汇总
  4. 华为H3C ER3100由器限速方法合集
  5. linux内核线程创建销毁机制
  6. mysql设置ssh连接_ssh修改连接数据库 将mysql改为sql连接
  7. 考研C++必刷题(一)
  8. JavaScript中的arguments对象
  9. 《CCNet: Criss-Cross Attention for Semantic Segmentation》--阅读笔记-ICCV2019
  10. 互联网数仓之:Lambda架构 vs Kappa架构
  11. 《C语言及程序设计》实践参考——定期存款利息计算器
  12. 【设计模式系列】--单例模式
  13. ubuntu20安装gdb插件gef的爬坑记录
  14. 新手蓝牙耳机选购攻略,2021什么牌子蓝牙耳机不容易踩雷
  15. 巧用Html5 History Api解决SPA的SEO问题
  16. 彩虹代shua网仿小储store模板 已去除后门
  17. 考研复试_英语面试_问与答
  18. 网易云课堂_C++程序设计入门(上)_第6单元:丹枫虽老犹多态–继承与多态
  19. 人机对齐概述|10. AGI可能导致的生存性风险:早期的概念性探讨
  20. Win10 SecureCRT 遇到一个致命的错误且必须关闭

热门文章

  1. 中国国家行政边界 审图号GS(2020)4632号
  2. 如何解决Chrome “无法从该网站添加应用,扩展程序和用户脚本”提示?
  3. Nginx安装Lua
  4. Harbor仓库开启https域名登陆报错问题
  5. 01-10-Hadoop-HA-概述
  6. 消化性溃疡知识要点整理
  7. java poi设置单元格格式为数值_java中导出excel设置单元格的样式为数字格式怎么设置_Java代码实现设置单元格格式...
  8. 《云计算应用架构》连载三:Amazon EC2
  9. 华悦城景观照明设计教程/中亚照明设计郑细辉Photoshop夜景亮化效果图制作技法解密
  10. 月薪一万和月薪十万的差距真的只有十倍吗?