sleep(0)、sleep(1)与sleep(1000)函数是不是很迷?!

        随着计算机科学和软件开发的飞速发展,开发者们常常需要在程序中引入一些时间控制的手段。其中,sleep函数成为了一种常见的工具,用于控制程序的执行速度、等待异步操作完成或者调度多线程任务。在这篇博客中,我们将深入研究三种睡眠函数:sleep(0)sleep(1)sleep(1000),并探讨它们之间的区别与应用场景。

sleep函数简介

        在编程中,sleep函数被用来使程序暂停执行一段时间。这段时间可以是毫秒、秒或者更长。sleep函数的调用通常是为了避免程序执行过快,或者等待某些任务完成。

sleep(0):放弃时间片

sleep(0)是一个特殊的情况,它的目的并不是为了让程序真正休眠,而是为了让当前线程主动放弃时间片,让其他等待执行的任务有机会执行。这在多线程或多任务的环境中特别有用,可以提高程序的效率。

sleep(1):短暂的等待

相比之下,sleep(1)就是一个相对较短的休眠时间,通常是1ms。它会在极短的1毫秒内进入睡眠(被放入等待队列中,进入等待状态,暂时放弃CPU竞争),1毫秒后立刻又再次参与CPU的竞争。这种情况常用于需要在执行之间添加短暂延迟的场景,或者等待一些异步操作完成。

sleep(1000):漫长的休眠

sleep(1000)则代表程序将休眠1000毫秒,即一秒钟。这种情况适用于需要较长时间延迟的场景,例如在某些长时间运行的任务之间,或者在特定时间执行某些操作。

需要注意:

提到sleep(0)不得不说Thread.yield()函数

Thread.yeild();也是当前 thread睡觉,让出CPU。(不释放锁)

Thread.sleep(0) 也是thread睡觉,让出CPU

相较之下,yeild()并不是立刻执行,比较温柔:不信看我下面的实测:

   Thread.yield() 方法是一个静态方法,用于提醒调度器当前线程愿意放弃 CPU 资源,让其他具有相同或更高优先级的线程有机会执行。调用 yield() 方法并不保证当前线程会立即停止执行,而只是表示当前线程愿意让出一部分执行时间。

public class Priority {private static volatile boolean notStart = true;private static volatile boolean notEnd = true;public static void main(String[] args) throws Exception {List<Job> jobs = new ArrayList<Job>();for (int i = 0; i < 10; i++) {int priority = i < 5 ?Thread.MIN_PRIORITY : Thread.MAX_PRIORITY;Job job = new Job(priority);jobs.add(job);Thread thread = new Thread(job, "Thread:" + i);thread.setPriority(priority);thread.start();}notStart = false;TimeUnit.SECONDS.sleep(10);notEnd = false;for (Job job : jobs) {System.out.println("Job Priority : " + job.priority +",Count : " + job.jobCount);}}static class Job implements Runnable {private int priority;private long jobCount;public Job(int priority) {this.priority = priority;}public void run() {while (notStart) {Thread.yield();}while (notEnd) {try {Thread.sleep(1);} catch (InterruptedException e) {throw new RuntimeException(e);}jobCount++;}}}
}

 相较之下,yield()比较生效比较温柔,慢

 

应用场景

  • sleep(0) 在需要平衡多任务执行的场景中,通过放弃时间片来提高整体程序的并发性。

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

  • sleep(1000) 适用于需要相对较长延迟的情况,例如在定时任务中等待一段时间后执行下一步操作。

结语

        sleep函数在编程中扮演着重要的角色,通过合理的使用,我们可以更好地控制程序的执行流程,提高程序的效率和稳定性。

        在选择使用 sleep(0)sleep(1) 还是 sleep(1000) 时,务必根据具体场景和需求进行合理的取舍,以达到最佳的程序性能。

希望通过这篇博客,读者们对这几种睡眠函数的区别有了更清晰的认识。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/580816.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安装、卸载、使用docker-compose

文章目录 Docker Compose一、安装Docker Compose二、卸载Docker Compose三、 使用docker compose编排nginxspringboot项目 Docker Compose 一、安装Docker Compose # Compose目前已经完全支持Linux、Mac OS和Windows&#xff0c;在我们安装Compose之前&#xff0c;需要先安装D…

在word文档中插入Latex格式的公式

用此方法可以不用在word中一点点插入公式&#xff0c;直接用Latex版的公式代码生成公式。 1.获取latex版公式 如我要在word中插入画框的公式&#xff0c;左边是该公式的latex版 也可以对公式截图使用如下的网页将公式的截图转为latex版 https://simpletex.cn/ai/latex_ocr …

Vue3超详细的ref()用法,看这一篇就够了

ref( ) 接受一个内部值&#xff0c;返回一个ref 对象&#xff0c;这个对象是响应式的、可更改的&#xff0c;且只有一个指向其内部值的属性 .value。 ref() 将传入参数的值包装为一个带 .value 属性的 ref 对象。 1、ref 对象是可更改的&#xff0c;即可以为 .value 赋予新的值…

Twinmotion教育版下载 / 找不到教育版解决方法

首先&#xff0c;在Epic Game Launcher中&#xff0c;找到Twinmotion标签 其中只有默认的试用版&#xff0c;没有教育版 众所周知&#xff0c;试用版没有相应的部分导出功能&#xff0c;而且有水印。 下载教育版&#xff1a; 1.打开官网&#xff1a;A cutting-edge real-time…

vue前端上传图片到阿里云OSS,超详细上传图片与视频教程

vue前端直传图片与视频到阿里云OSS 1. 简介与日常使用2. 为什么要这么干&#xff1f;是因为我司后端不行吗&#xff1f;&#xff1f;&#xff1f;&#xff08;确实&#xff01;&#xff09;3. vue前端直传的操作4. 如何上传到阿里OSS指定文件夹呢? 1. 简介与日常使用 阿里云…

python高级(补充)

闭包 闭包的定义: 在函数嵌套的前提下&#xff0c;内部函数使用了外部函数的变量&#xff0c;并且外部函数返回了内部函数&#xff0c;我们把这个使用外部函数变量的内部函数称为闭包 通过闭包的定义&#xff0c;我们可以得知闭包的形成条件: 1- 在函数嵌套(函数里面再定义…

【node-express】实现省县市/区三级联动接口

省县市/区三级联动接口 介绍接口步骤代码部分 介绍 源码地址&#xff1a;https://github.com/thinkasany/nestjs-course-code/tree/master/demo/address 使用 navicat 导入sql文件&#xff0c;新增表&#xff0c;然后只需要一个接口 localhost:3001/region?parentId1, 不断的…

Leetcode—2660.保龄球游戏的获胜者【简单】

2023每日刷题&#xff08;七十二&#xff09; Leetcode—2660.保龄球游戏的获胜者 实现代码 class Solution { public:int isWinner(vector<int>& player1, vector<int>& player2) {long long sum1 0, sum2 0;int n player1.size();for(int i 0; i &…

02之Python运算符与if结构

Day02之Python运算符与if结构 一、昨日回顾 1、回顾昨天的课程内容 略 2、回顾昨天的作业 定义变量&#xff0c;c1 ‘可乐’&#xff0c;c2 ‘牛奶’&#xff0c;通过Python代码把c1内容调整为牛奶&#xff0c;c2调整为可乐。 # 1、定义两个变量 c1 可乐 c2 牛奶# 2、…

Python实现张万森下雪了的效果

写在前面 即将步入婚宴殿堂的女主林北星&#xff0c;遭遇了男友展宇的毁约&#xff0c;生活和工作也变得一团糟。与此同时&#xff0c;她被时光老人带回了十八岁的高三时光&#xff0c;重新开启了自己的人生。林北星摆脱了展宇的束缚&#xff0c;认真准备高考&#xff0c;想要…

硬件调试-电源纹波测量

硬件调试-电源纹波测量 Fang XS.1452512966qq.com如果有错误&#xff0c;希望被指出&#xff0c;学习技术的路难免会磕磕绊绊量的积累引起质的变化感谢酸奶大佬提供的硬件技术指导&#xff1b; 电源纹波 百度百科定义如下&#xff1a; 纹波是由于直流稳定电源的电压波动而造…

QML —— Button按钮、FileDialog选择框示例(附完整源码)

示例效果 相关对象 Button&#xff1a;按钮表示用户可以按下或点击的按钮控件。按钮通常用于执行操作或回答问题。典型的按钮有“确定”、“应用”、“取消”、“关闭”、“是”、“否”和“帮助”。按钮从AbstractButton继承其API。例如&#xff0c;您可以使用AbstractButton …

如何开发一个类似美团小程序商家入驻

上线类似美团的小程序可以推动商业生态系统的优化和升级。小程序可以连接商家、用户和平台&#xff0c;促进信息流通和交易&#xff0c;提高整个生态系统的效率和效益。今天&#xff0c;我们分享如何开发一个类似美团小程序商家入驻的平台。大家点个关注点个赞&#xff0c;我们…

元道经纬相机信息化赋能光伏电站运维管理

近年来&#xff0c;我国光伏产业高速发展&#xff0c;尤其以分布式光伏发电项目增长迅速&#xff0c;为更好服务新能源发电&#xff0c;大力推广电能替代。与此同时&#xff0c;电力企业亟需改变落后的管理模式&#xff0c;借助信息化软件提升管理效率。 为了进一步提升光伏电…

声明 | 为打击假冒账号、恶意抄袭账号等诈骗活动,提升本账号权威,本博主特此郑重声明

声明 | 为打击假冒账号、恶意抄袭账号诈骗活动&#xff0c;提升本账号权威&#xff0c;本博主特此郑重声明 一、本账号为《机器学习之心》博主CSDN唯一官方账号&#xff0c;唯一联系方式见文章底部。 二、《机器学习之心》博主未授权任何第三方账号进行模型合作、程序设计、源…

腾讯云老用户优惠:轻量应用服务器2核2G4M带宽118元一年,3年540元

它急了&#xff0c;腾讯云急了&#xff0c;继阿里云推出99元新老用户同享的云服务器后&#xff0c;腾讯云轻量应用服务器2核2G4M配置也支持新老用户同享了&#xff0c;一年118元&#xff0c;3年540元&#xff0c;老用户也能买&#xff0c;50GB SSD系统盘&#xff0c;300GB 月流…

[Ray Tracing: The Next Week] 笔记

前言 本篇博客参照自《Ray Tracing: The Next Week》教程&#xff0c;地址为&#xff1a;https://raytracing.github.io/books/RayTracingTheNextWeek.html 该教程在ray tracing in one weekend的基础上&#xff0c;增加了运动模糊、BVH树、Texture映射、柏林噪声、光照、体积…

Appium如何实现移动端UI自动化测试呢?

Appium是一个开源跨平台移动应用自动化测试框架。 既然只是想学习下Appium如何入门&#xff0c;那么我们就直奔主题。文章结构如下&#xff1a; 为什么要使用Appium&#xff1f;如何搭建Appium工具环境?(超详细&#xff09;通过demo演示Appium的使用Appium如何实现移动端UI自…

使用CRA(create-react-app)初始化一个完整的项目环境(该初始化项目已上传到本文章的资源)

1. 整理项目结构&#xff0c;项目目录结构大致划分如下&#xff1a; 2. 安装sass 安装sass开发环境, 注意&#xff1a;使用的文件后缀名要用.scssnpm i sass -D3. 安装Ant Design npm i antd --save 4. 配置基础路由Router&#xff08;具体可参考ReactRouter使用详解&#x…

Spring高手之路-SpringBean的生命周期

目录 SpringBean的生命周期 整体介绍 详细介绍 1.实例化Bean 2.设置属性值 3.检查Aware 4.调用BeanPostProcessor的前置处理方法 5.调用InitializingBean的afterPropertiesSet方法 6.调用自定义init-method方法 7.调用BeanPostProcessor的后置处理方法 8.注册Destru…