线程中sleep()方法和wait()方法的前生今世
先看再点赞,给自己一点思考的时间,如果对自己有帮助,微信搜索【程序职场】关注这个执着的职场程序员。
我有什么:职场规划指导,技能提升方法,讲不完的职场故事,个人成长经验。
不知道大家有没有这种感觉,在公司项目忙碌的时候,有时候感觉又忙又累,甚至加班通宵都有,能忙死人,每天想着轻松点吧,能休息休息做点别的什么。
但是当项目收尾不忙(不忙是指不用加班)的时候,如果一天两天还好,但是时间超出一周(不是没事干,是不像之前每天加班才能完成任务,现在每天8个小时不到就完成了任务),总是感觉太闲了,不太充实了,不知道该干什么。这边找点事,那边找点事
有时候甚至想着还是忙点吧。
所以趁着最近几天不是太忙,对自己做了一个复盘,发现我计划的东西还有一半没有完成(比如:我读的书 和 写的教程还只是做到2/1),所以还要加油,更主要的是 公众号文章的更新以后要保持下去。
好了不发感慨了,开始我们今天的线程篇(这些文章目前已经做了分类,多了就能成系统了)。
1,sleep和wait概念
Java中的多线程是一种抢占式的机制。
线程主要有以下几种状态:可运行,运行,阻塞,死亡。抢占式机制指有多个线程处于可运行状态,但是只有一个线程在运行。
当有多个线程访问共享数据的时候,就需要对线程进行同步。线程中的几个主要方法的比较:
Thread类的方法:sleep(),yield()等
Object的方法:wait()和notify()等
每个对象都有一个机锁来控制同步访问。Synchronized关键字可以和对象的机锁交互,来实现线程的同步。
由于sleep()方法是Thread类的方法,因此它不能改变对象的机锁
Wait()方法和notify()方法:当一个线程执行到wait()方法时(线程休眠且释放机锁),它就进入到一个和该对象相关的等待池中,同时失去了对象的机锁。
当它被一个notify()方法唤醒时,等待池中的线程就被放到了锁池中。该线程从锁池中获得机锁,然后回到wait()前的中断现场。
共同点: 他们都是在多线程的环境下,都可以在程序的调用处阻塞指定的毫秒数,并返回。
不同点: Thread.sleep(long)可以不在synchronized的块下调用,而且使用Thread.sleep()不会丢失当前线程对任何对象的同步锁(monitor);
object.wait(long)必须在synchronized的块下来使用,调用了之后失去对object的monitor, 这样做的好处是它不影响其它的线程对object进行操作。
2. sleep和wait方法的应用场景
sleep 休眠方法:
Static void sleep(long ms)
该方法会使当前线程进入阻塞状态指定毫秒,当阻塞指定毫秒后,当前线程会重新进入Runnable状态,等待划分时间片。
wait方法一般是跟notify方法连用的:
多线程之间需要协调工作。如果条件不满足则等待。当条件满足时,等待该条件的线程将被唤醒。在Java中,这个机制实现依赖于wait/notify。
3,简单使用
一,Sleep()
Sleep方法属于Thread类,调用Sleep时会暂停此线程指定的时间,但它的监控一直在监控着,Sleep不会释放对象的锁,到了一定时间它会自动唤醒。
Sleep方法有接收时间参数,Therad.Sleep(1000) 其中参数都是毫秒值。
public class ThreadSleep {public static void main(String[] args) {// write your code hereint time = 10;for (int i=1;i<=time;i++) {
try {
Thread.sleep(1000);
System.out.println("线程休眠时间=" + i +"秒");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}}
上面的代码循环中间隔一秒输出一个信息。
线程休眠时间=1秒
线程休眠时间=2秒
线程休眠时间=3秒
线程休眠时间=4秒
线程休眠时间=5秒
线程休眠时间=6秒
线程休眠时间=7秒
线程休眠时间=8秒
线程休眠时间=9秒
线程休眠时间=10秒
Process finished with exit code 0
二,Wait()
1.Wait()方法属于Object类,调用Wait方法时,线程会放弃对象锁,进入等待此对象的等待锁定池,只有此对象调用notify()方法后本线程才进入对象锁定池准备,wait方法需要被动唤醒,
2. wait方法不需要时间参数
public class ThreadWait {public static void main(String[] args) {
/*** 作者:公众号:程序职场* 代码描述:创建两个线程一个操作年龄的信息,一个是工作量的信息*/
//输出年龄信息
Object obj=new Object();
Thread download=new Thread(){
public void run() {
System.out.println("开始输出年龄");
for (int i = 1; i < 6; i+=1) {
System.out.println("年龄="+i);
}
System.out.println("年龄输出成功");
synchronized (obj) {
System.out.println("唤起");
obj.notify();//唤起wait的等待
}
System.out.println("开始输出工作量");
for (int i = 1; i < 6; i+=1) {
System.out.println("工作量="+i+"小时");
}
System.out.println("工作量输出成功");
}
};//2.年龄输出成果的结果
Thread show=new Thread(){
public void run(){
synchronized (obj) {
try {
System.out.println("阻塞");
obj.wait();//阻塞当前
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("年龄完成");
}
}
};
download.start();
show.start();
}}
1,show线程中阻塞线程(wait)
2,download线程中 唤醒(notify)
本文 Github ( 码云Gitee同步) https://github.com/ProceduralZC/JavaDevGuide/tree/master/code/JavaTheead/ThreadClass 已收录,欢迎 star。
我是【尔东双月】一枚执着的职场程序员,微信搜索【程序职场】关注我。别忘了三连啊,点赞、收藏、留言,随意给,我不挑。
知乎号: 程序职场
注:如果文章有任何问题,欢迎毫不留情地指正。
线程中sleep()方法和wait()方法的前生今世的更多相关文章
- 线程中sleep方法和wait方法有什么区别?(转)
本文转自https://www.cnblogs.com/linkstar/p/6043846.html 线程中sleep方法和wait方法有什么区别? 如果你没有接触过java的多线程,那么多对于 ...
- 线程中sleep方法和wait方法有什么区别?
如果你没有接触过java的多线程,那么多对于这两个方法可能有点陌生,看名字好像这两个方法是差不多的,但是实际上面差别好大. 首先我们看一下官方的API Sleep(sleep有两个方法,另一个方法传递 ...
- Hibernate中evict方法和clear方法说明
Hibernate中evict方法和clear方法说明 先创建一个对象,然后调用session.save方法,然后调用evict方法把该对象清除出缓存,最后提交事务.结果报错: Exception i ...
- Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行,它们有什么区别? 线程的sleep()方法和yield()方法有什么区别?
Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行,它们有什么区别? sleep()方法(休眠)是线程类(Thread)的静态方法,调用此方法会让当前线程暂停执行指定的时间 ...
- ThinkPHP 中M方法和D方法详解----转载
转载的地址,http://blog.163.com/litianyichuanqi@126/blog/static/115979441201223043452383/ 自己学到这里的时候,不能清除的分 ...
- ThinkPHP 中M方法和D方法的具体区别(转)
M方法和D方法的区别 ThinkPHP 中M方法和D方法都用于实例化一个模型类,M方法 用于高效实例化一个基础模型类,而 D方法 用于实例化一个用户定义模型类. 使用M方法 如果是如下情况,请考虑使用 ...
- ThinkPHP 中M方法和D方法的具体区别
M方法和D方法的区别 ThinkPHP 中M方法和D方法都用于实例化一个模型类,M方法 用于高效实例化一个基础模型类,而 D方法 用于实例化一个用户定义模型类. 使用M方法 如果是如下情况,请考虑使用 ...
- jquery中prop()方法和attr()方法
接着上一篇笔记的疑惑,找了下prop()方法和attr()方法的区别. 原来query1.6中新加了一个方法prop(),一直没用过它,官方解释只有一句话:获取在匹配的元素集中的第一个元素的属性值. ...
- js进阶 12-13 jquery中one方法和trigger方法如何使用
js进阶 12-13 jquery中one方法和trigger方法如何使用 一.总结 一句话总结: 1.one()方法和on()方法的区别是什么? 除了one()只执行一次,其它和on()一模一样,包 ...
随机推荐
- FreeBSD 13.0 正式版发布,已经可以下载
请访问原文链接:https://sysin.org/article/freebsd-13/,查看最新版.原创作品,转载请保留出处. 根据 FreeBSD 13.0 官方发布计划,4 月 9 日 13. ...
- linux中用iptables开启指定端口
linux中用iptables开启指定端口 centos默认开启的端口只有22端口,专供于SSH服务,其他端口都需要自行开启. 1.修改/etc/sysconfig/iptables文件,增加如下 ...
- TVMNN编译Compiler栈
TVMNN编译Compiler栈 内容纲要 前言 调研目标 TVM介绍 TVM源码架构 FrontEnd Relay BackEnd VTA实现原理及设计思想提炼 整体结构 VTA Hardware ...
- Camera HDR Algorithms
Camera HDR Algorithms HDRI是High-Dynamic Range(HDR)image的缩写,也就是高动态范围图像.它就是为了解决更好的存储高动态范围图像这个问题而发明出来的. ...
- halcon——缺陷检测常用方法总结(频域空间域结合)
摘要 缺陷检测是视觉需求中难度最大一类需求,主要是其稳定性和精度的保证.首先常见缺陷:凹凸.污点瑕疵.划痕.裂缝.探伤等. 缺陷检测算法不同于尺寸.二维码.OCR等算法.后者应用场景比较单一,基本都是 ...
- awr快照保留时间修改
============== awr快照保留时间修改 ============= 1.查询当前awr报告保留时间 col SNAP_INTERVAL for a20col RETENTION for ...
- Java基础_循环嵌套_打印乘法口诀、菱形,各种图形,计算二元一次和三元一次方程组_7
循环嵌套 打印乘法口诀 for(int j=1;j<=9;j++){ for(int i=1;i<=j;i++){ System.out.print(i+"*"+j+& ...
- python学习笔记05-条件分支与循环1
思考问题:100分制,90分以上为A,80-90为B,60-80为C,60以下为D,当用户输入成绩后,打印对应的字母 temp=input('请输入你的成绩:') score=int(temp) if ...
- ClickHouse学习系列之四【副本&分片部署说明】
背景 以前介绍过ClickHouse相关的系列文章,现在继续说明.本文开始说明ClickHouse的副本与分片,和其他数据库一样,ClickHouse也会出现单节点故障和单节点资源到达上限的情况.所以 ...
- Go语言判断一个字节的高位大于四
Go语言判断一个字节的高位大于四 1.步骤: 第一步,将该字节的低位清零(与0xF0进行&运算) 为了后面与0x40比较 0xF0转为二进制是1111 0000,&运算(两个同时为1, ...