当前位置: 首页 > 编程日记 > 正文

Java多线程复习:5(sleep、yield方法和线程优先级)

sleep、yield方法和线程优先级

sleep方法

  1. 调用 sleep 会让当前线程从 Running 进入 Timed Waiting 状态(阻塞)
  2. 其它线程可以使用 interrupt 方法打断正在睡眠的线程,这时 sleep 方法会抛出 InterruptedException;
  3. 睡眠结束后的线程未必会立刻得到执行,还得看任务调度器的心情
  4. 建议用 TimeUnit 的 sleep 代替 Thread 的 sleep 来获得更好的可读性;

我们下面会用三个例子来说明上面的几点。
例一:

import lombok.extern.slf4j.Slf4j;@Slf4j(topic = "c.Test1")
public class Test1 {public static void main(String[] args) {Thread thread = new Thread("thread"){@Overridepublic void run() {try {//调用 sleep 会让当前线程从 Running 进入 Timed Waiting 状态(阻塞)Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}}};thread.start();log.debug("thread state:{}",thread.getState());try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}log.debug("thread state:{}",thread.getState());}
}

运行结果:
在这里插入图片描述
我们可以看到,在调用 sleep 方法后会让当前线程从 Running 进入 Timed Waiting 状态(阻塞)。

例二:

import lombok.extern.slf4j.Slf4j;@Slf4j(topic = "c.Test1")
public class Test2 {public static void main(String[] args) {Thread thread = new Thread("thread") {@Overridepublic void run() {log.debug("进入睡眠");try {Thread.sleep(2000);} catch (InterruptedException e) {log.debug("thread线程醒过来了");e.printStackTrace();}}};thread.start();try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}log.debug("唤醒thread线程");//其它线程可以使用 interrupt 方法打断正在睡眠的线程,这时 sleep 方法会抛出 InterruptedExceptionthread.interrupt();}
}

运行结果:
在这里插入图片描述
我们在例二的代码中调用了interrupt方法来打断了此时正在睡眠的线程thread,因为被打断睡眠了,所以此时sleep抛出InterruptedException异常。

例三:

import lombok.extern.slf4j.Slf4j;import java.util.concurrent.TimeUnit;@Slf4j(topic = "c.Test3")
public class Test3 {public static void main(String[] args) throws InterruptedException {log.debug("开始睡眠");//其实TimeUnit内部也是调用原生的sleep方法,//只不过TimeUnit给它进行了一下单位的换算,增加了可读性(不用数那么多个0了...)TimeUnit.SECONDS.sleep(1);log.debug("结束睡眠");}
}

运行结果:
在这里插入图片描述
其实TimeUnit最大的优点就是增加了可读性,再也不用数0了😂。而且TimeUnit的底层还是使用了Thread.sleep方法的,它只不过是帮我们进行了一下单位的换算,如下图:
在这里插入图片描述
最后,注意:sleep方法写在哪个线程中,它就会让那个线程休眠

yield方法

  1. 调用 yield 会让当前线程从 Running 进入 Runnable 就绪状态,然后调度执行其它线程
  2. 具体的实现依赖于操作系统的任务调度器

下面举个例子来说明一下

import lombok.extern.slf4j.Slf4j;@Slf4j(topic = "c.Test1")
public class Test1 {public static void main(String[] args) {Thread thread1 = new Thread(()->{int count = 0;for (;;){System.out.println("--->thread1 "+count++);}});Thread thread2 = new Thread(()->{int count = 0;for (;;){//这里使用yield来限制thread的时间片,//使得thread1分到的时间片更多,我们可以通过打印的数字来看出Thread.yield();System.out.println("             ---->thread2 "+count++);}});thread1.setName("thread1");thread2.setName("thread2");thread1.start();thread2.start();}
}

运行结果:
在这里插入图片描述
运行时间越长,即CPU越繁忙,yield方法的效果越明显。

线程优先级

  • 线程优先级会提示(hint)调度器优先调度该线程,但它仅仅是一个提示,调度器可以忽略它(所以它不太靠谱);
  • 总的来说就是数字越大优先级越高。

需要注意的一点
如果 CPU 比较忙,那么优先级高的线程会获得更多的时间片,但 CPU 闲时,优先级几乎没作用。

我们点进Thread类的源码里面可以找到关于线程优先级的三个变量,如下图:
在这里插入图片描述
MIN_PRIORITY = 1 是最低的优先级
NORM_PRIORITY = 5 是默认的优先级
MAX_PRIORITY = 10 是最高的优先级

我们举个例子来说明一下线程的优先级

import lombok.extern.slf4j.Slf4j;@Slf4j(topic = "c.Test1")
public class Test1 {public static void main(String[] args) {Thread thread1 = new Thread(()->{int count = 0;for (;;){System.out.println("--->thread1 "+count++);}});Thread thread2 = new Thread(()->{int count = 0;for (;;){System.out.println("             ---->thread2 "+count++);}});thread1.setName("thread1");thread2.setName("thread2");//通过观察这里的运行结果,我们可以看到,如果运行的越久,//即CPU越繁忙,则thread1被调用的几率大大减少,而thread2线程被调用的几率大大增加;//反之,如果一运行就停止下来的话,他们两个被调用的几率其实没有太大的差别thread1.setPriority(Thread.MIN_PRIORITY);thread2.setPriority(Thread.MAX_PRIORITY);thread1.start();thread2.start();}
}

运行结果:
在这里插入图片描述
可以看到,在CPU较繁忙的时候,线程优先级的作用就体现出来了。

相关文章:

Atitit.java jna  调用c  c++ dll的原理与实践  总结  v2  q27

Atitit.java jna 调用c c dll的原理与实践 总结 v2 q27 1. Jna简单介绍1 2. Jna范例halo owrld1 3. Jna概念2 3.1. (1)需要定义一个接口,继承自Library 或StdCallLibrary2 3.2. 2)接口内部定义2 4. 数据类型映射 NA官方给出的…

Android自定义控件系列之基础篇

一、概述在android开发中很多UI控件往往需要进行定制以满足应用的需要或达到更加的效果,接下来就通过一个系列来介绍自定义控件,这里更多是通过一些案例逐步去学习,本系列有一些典型的应用,掌握好了大家也可去创新开发出一些更好的UI&#xf…

用matlab编辑器打开.m文件

1、复制如下代码在,matlab命令行里运行 commandwindow; cwdpwd; cd([matlabroot \toolbox\matlab\winfun\private]); fileassoc(add,{.m,.mat,.fig,.p,.mdl,[. mexext]}); % 重点,增加了多种文件类型 cd(cwd); disp(Changed Windows file associations.…

Unity制作2D动作平台游戏视频教程

Metroidvania工具包:打造统一的2D行动平台 流派:电子学习| MP4 |视频:h264,1280720 |音频:AAC,48.0 KHz 语言:英语中英文字幕(根据原英文字幕机译更准确)|大小解压后:8.96 GB |时长:20h 53m 学习用C#编码&#xff0c…

Redis初学:1(NoSQL的简介和Redis的安装)

什么是NoSQL NoSQL数据库意即:Not Only SQL 不仅仅是SQL,它区别于传统的关系型数据库,储存方式按照的是key-value的形式存储数据,这个我们可以联想到我们以前学过的HashMap。 NoSQL的特点: 语法上区别于传统的SQL语句…

函数指针amp;绑定: boost::functoin/std::function/bind

see link: https://isocpp.org/wiki/faq/pointers-to-members function vs template: http://stackoverflow.com/questions/14677997/stdfunction-vs-template boost::functoin/std::function可用于全部 operator() 操作的对象(函数,类。成员…

Python编程规范及性能优化

为什么80%的码农都做不了架构师?>>> Ptyhon编程规范 编码 所有的 Python 脚本文件都应在文件头标上 # -*- coding:utf-8 -*- 。设置编辑器,默认保存为 utf-8 格式。 注释 业界普遍认同 Python 的注释分为两种的概念,一种是由 # 开…

Matlab 快捷键 设置

把Matlab的快捷键都和Windows平台上的保持一致。设置方法:[File]->[Preferences]->[Command Window]->[Keyboard & indenting]->[command line key bindings][File]->[Preferences]->[Editor/Debugger]->[Keyboard & indenting]->[…

Maya与Substance Painter风格化材质阴影和照明学习教程

大小解压后:619 M 1920X1080 mp4 时长:第一部分 48分55秒 第二部分 32分29秒 语言:英语中英文字幕(根据原英文字幕机译更准确) 第一部分介绍Substance Painter风格化材质制作 第二部分介绍Maya中灯光及阴影的学习技…

Deep learning的一些教程 (转载)

几个不错的深度学习教程,基本都有视频和演讲稿。附两篇综述文章和一副漫画。还有一些以后补充。 Jeff Dean 2013 Stanford http://i.stanford.edu/infoseminar/dean.pdf 一个对DL能干什么的入门级介绍,主要涉及Google在语音识别、图像处理和自然语言处理…

Redis初学:2(Redis的启动)

Redis有两种启动方式 前台启动(不推荐) 直接使用命令redis-server,执行结果如下图: 想要退出直接按ctrlc即可 后台启动(推荐) 先在redis的安装目录下复制redis.conf文件到任意一个文件夹底下然后将red…

iOS开发系列--通知与消息机制

http://www.cocoachina.com/ios/20150318/11364.html 概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情。iOS中通知机制又叫消息机制,其包括两类&a…

解决Undefined function or method 'vgg_kmiter' for input arguments of type 'double'.

Undefined function or method vgg_kmiter for input arguments of type double. Error in > vgg_kmeans at 32 [CX, sse] vgg_kmiter(X, CX); 解决方法: 由于高matlab版本不再支持mxCreateScalarDouble,而被变为mxCreateDoubleScalar.因而把所…

C#和Unity游戏开发者大师班2021 (2D,3D和FPS)

流派:电子学习| MP4 |视频:h264,1280720 |音频:AAC,44.1 KHz 语言:英语中英文字幕(根据原英文字幕机译更准确) |大小:11.1 GB |时长:22h 31m 含项目文件 创建你的第一个Unity游戏-水果忍者克隆,豪斯梅斯特…

Redis初学:4(Redis的常用命令)

Redis的常用命令 查看所有key keys *如下图: 插入key set key value如下图: 取出key对应的value值 get key如下图: 查看某个key是否存在 exists key如下图: 1表存在这个key,0表示不存在 判断某个key是什么…

计算多项式的值

总时间限制: 1000ms内存限制: 65536kB描述对于多项式f(x) ax3 bx2 cx d 和给定的a, b, c, d, x,计算f(x)的值。 输入输入仅一行,包含5个实数,分别是x,及参数a、b、c、d的值,每个数都是绝对值不超过100的双精度浮点…

bash 脚本编程2 条件判断 (笔记)

条件判断类型:整数测试字符测试文件测试条件表达式: [ exppression ] expression test expression 注意一定要加空格前后都要加整数比较: -eq 测试两个整数是否相等,相等为真,不等为假。 equal-ne 测试两个整数是否…

matlab视频保存为图片

将如下代码保存到m文件,不是函数文件,是script文件, matlab 将视频保存为图片 可以根据需要自行修改 [filename,pathname,fileindex]uigetfile(*.avi,请选择一个Avi文件); dnameuigetdir(c:/,保存到); dname[dname \]; video_infoVideoRea…

Blender车辆绑定动画制作视频教程

MP4 |视频:h264,1280720 |音频:AAC,44.1 KHz,2 Ch 语言:英语中英文字幕(根据原英文字幕机译更准确) |时长:72节课(22小时9m) |大小解压后:22 GB 含课程项目素材 ~在Blender中为动画装配汽车、卡车、轨道和…

Redis初学:5(String类型的基本操作)

String类型 String类型是Redis中最基本的类型,String类型有以下的一些特点: String类型是二进制安全的,这意味着String类型可以包含任何的数据,如:图片、序列化的对象等;Redis中一个String类型的value的大…

【PL/SQL】--导出oracle单表数据--drp204

转载于:https://www.cnblogs.com/wangmei/p/5187660.html

使用模块化编译缩小 apk 体积

libcocos2dlua.so编译出来有11M多,其中包含了很多不需要的模块,模块化编译,把不需要用到的模块弄成0,体积就小了。 如: 修改D:\codeide\sDiShu2formm\frameworks\runtime-src\proj.android\jni\Application.mk为 ifeq …

matlab2013a vs2013 opencv2.4.8 编译TLD

出现如下错误是因为编译方法不对,bb_overlap.cpp(36) : error C3861: “min”: 找不到标识符 bb_overlap.cpp(36) : error C3861: “max”: 找不到标识符 bb_overlap.cpp(37) : error C3861: “min”: 找不到标识符 bb_overlap.cpp(3…

UE5和Blender中的完整场景环境创建学习教程

UE5和Blender中的完整环境创建–深入课程 MP4 |视频:h264,1280720 |音频:AAC,44.1 KHz,2 Ch 语言:英语中英文字幕(根据原英文字幕机译更准确)|时长:80节课(30h 48m) |大小解压后:28 GB 了解专业环境艺术家…

Redis初学:6(List类型)

List类型 List的特点:单键多值 Redis的List是简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表的头部(左边)或者尾部(右边)。 它的底层实际是个双向链表,对两段的操作性能很高&…

2.交叉工具链

2.交叉工具链 一、交叉工具链: 交叉工具链,其实他有两个含义,一个就是交叉工具,所谓的交叉工具就是运行的环境和编译的环境不是在一体的。就像我们现在,编译裸机程序是在pc机上面执行的。可我们运行程序是在开发板。…

Windows内存管理和linux内存管理

windows内存管理 windows 内存管理方式主要分为:页式管理,段式管理,段页式管理。 页式管理的基本原理是将各进程的虚拟空间划分为若干个长度相等的页;页式管理把内存空间按照页的大小划分成片或者页面,然后把页式虚拟地…

UltraEdit 21激活

无需断网 UE v21.00.0.1033激活UE v21.00.0.1033激活UE v21.00.0.1033激活UE v21.00.0.1033激活UE v21.00.0.1033激活 UE v21.00.0.1056激活UE v21.00.0.1056激活UE v21.00.0.1056激活UE v21.00.0.1056激活UE v21.00.0.1056激活 点击我去下载激活器 如果激活遇到“ultraEdit …

Unity创建使用操纵杆飞行动画教程

Unity 3d移动超级英雄使用操纵杆飞行 MP4 |视频:h264,1280720 |音频:AAC,44.1 KHz,2 Ch 语言:英语中英文字幕(根据原英文字幕机译更准确) |时长:20节课(5h 16m) |大小解压后:3.37 GB 含 COURSE FOLDER FIL…

Redis初学:7(Set类型)

Set集合类型 简介 Redis里面的Set类型跟Java里面的Set一样,都是带有自动除重的,它里面不会出现重复的数据。 特点:自动除重 底层数据结构 Redis中的Set是一个String类型的无序集合,它的底层其实是一个value值为null的hash表&a…