java sleep和wait区别

为什么80%的码农都做不了架构师?>>>   hot3.png

关于sleep和wait区别解析:

sleep只是释放CPU资源,并不释放资源锁对象,wait是会释放掉资源锁对象。

比如,有个锁对象object,线程1和线程2都会锁住object对象。运行线程1,线程1中使用wait方法,这个时候,线程1就处于卡死状态了,这时候我们运行线程2,线程2中使用sleep。这时候,如果资源锁没有释放,线程2是不会被执行的,因为资源锁被线程1占用,但是wait会释放资源锁,所以现象就是,线程1会执行,并且拿到资源锁。

搞个例子来看下:

public static Object lock = new Object();
//开启一个线程1
new Thread(() ->
{//首先搞个锁对象synchronized (lock) {System.out.println("线程1已拿到资源锁对象");try {//注意此处的区别//lock.wait(5000);Thread.sleep(5000);} catch (Exception ex) {ex.printStackTrace();}System.out.println("线程1资源锁准备释放");}}).start();Thread.sleep(10);//开启一个线程2
new Thread(() ->
{//首先搞个锁对象synchronized (lock) {System.out.println("线程2已拿到资源锁对象");try {Thread.sleep(1000);} catch (Exception ex) {ex.printStackTrace();}System.out.println("线程2资源锁准备释放");}
}).start();

注意线程1中注释的代码,我们先来看下都是sleep情况下的结果,如下图,线程1资源释放后,线程2才能拿到锁继续执行。

3ddfad9ce09b0efa4f22850b0234cb9aca7.jpg

接下来我们把线程1中的sleep换成wati方法来看下结果,线程1拿到资源锁后,调用wait会释放资源锁,这时线程2就可以拿到锁的。如果线程1wait到时间后会继续执行。

466149f1d6be24110a6fc4146147886cb83.jpg

接下来测试下,wait唤醒后是否会拿到锁后执行,还是不用拿锁执行。调整下代码,线程1中的wait去掉时间设定,改为手工唤醒。线程2中添加唤醒线程1的方法,然后运行程序看下结果。

//开启一个线程1
new Thread(() ->
{//首先搞个锁对象synchronized (lock) {System.out.println("线程1已拿到资源锁对象");try {//注意此处的区别lock.wait();//Thread.sleep(5000);} catch (Exception ex) {ex.printStackTrace();}System.out.println("线程1资源锁准备释放");}}).start();Thread.sleep(10);//开启一个线程2
new Thread(() ->
{//首先搞个锁对象synchronized (lock) {System.out.println("线程2已拿到资源锁对象");try {Thread.sleep(1000);//测试线程1是否会再次拿到锁对象lock.notify();System.out.println("已唤醒线程1");Thread.sleep(3000);} catch (Exception ex) {ex.printStackTrace();}System.out.println("线程2资源锁准备释放");}
}).start();

线程2唤醒线程1后,线程1并没有马上执行,而是等到线程2将资源锁释放后,线程1才开始执行。

722859a9f1ca2c33641b912ad01b4d11d93.jpg

 

让线程睡眠今天发现还有另外一种方式,本质上其实还是Thread.sleep()

TimeUnit.SECONDS.sleep(4);

 

 

转载于:https://my.oschina.net/uwith/blog/3002557

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

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

相关文章

u8转完看不到菜单_web网页有错误,无法看到操作菜单-用友U8

文章摘要:本文提供在用友U8V8.51erp软件财务会计管理的WEB财务模块中客户在使用WEB功能时,没有使用默认的设置,是将WEB功能设置在自己的网站上面,访问WEB功能没有问题,界面出来了,输入用户名、密码、选择帐…

.Net Core 项目引用本地类库方式(二)

上篇文章有详细的介绍.Net Core 项目中引用本地类库通过打包,然后Nugety引用方式,这里再介绍一种引用包的方式 转载于:https://www.cnblogs.com/wangshitou/p/10283800.html

深入理解equals和hashCode关系和区别

深入理解equals和hashCode关系和区别直入主题:区别:1.他们判断对象相同的方式不一样:2.他们判断对象是否相等的准确率不一样:改写equals时总是要改写hashcode分享一波:程序员赚外快-必看的巅峰干货为什么要说equals和hashCode这两…

lol韩服游戏内设置_韩服LOL进去了还不能玩?教你如何玩韩服!

领取免费韩服LOL安全号,百度搜索韩服LOL微博关注即可!上图错误为常识性错误,LOL韩服游戏的安装文件路径有中文所导致的错误 解决方法:将安装路径里的中文改成英文即可 举例 包含中文汉字的文件夹都是错误的 Program FilesLOL韩服 …

Jdk 和 jre 的 关系和区别

Jdk 和 jre 的 关系和区别 区别: JDK:是Java Development Kit 的简称–>翻译过来就是:Java 开发工具包。是程序员使用java语言编写java程序所需的开发工具包,是提供给程序员使用的。 JRE:是Java Runtime Environm…

OpenCV-Python入门教程7-PyQt编写GUI界面

前面一直都是使用命令行运行代码,不够人性化。这篇用Python编写一个GUI界面,使用PyQt5编写图像处理程序。包括:打开、关闭摄像头,捕获图片,读取本地图片,灰度化和Otsu自动阈值分割的功能。 使用Qt Designer…

spark 广播变量大数据_大数据处理 | Spark集群搭建及基本使用

点击蓝字关注我前面用了一篇文章详细的介绍了集群HDFS文件系统的搭建,HDFS文件系统只是一个用于存储数据的系统,它主要是用来服务于大数据计算框架,例如MapReduce、Spark,本文就接着上一篇文章来详细介绍一下Spark集群的搭建及Spa…

如何将本地项目上传到gitee

*************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 如果以上内容对你觉得有用,并想获取更多的赚钱方式和免费的技术教程 请关注微信公众号:HB荷包 一个能让你学习技术和赚钱方法的公众号,持续更…

oracle dg 备库未设置convert参数导致ORA-01111,ORA-01110

2019独角兽企业重金招聘Python工程师标准>>> 查看trace 文件: MRP0: Background Managed Standby Recovery process started (amls) started logmerger process Sun Jan 20 07:55:53 2019 Managed Standby Recovery starting Real Time Apply MRP0: Back…

git回退历史版本无法上传_Git系列教程(二):版本库中添加文件、版本回退

Git系列教程(一):简介、安装、配置我们学习了分布式和版本控制系统的概念、Git具有的8个功能以及如何在Windows上安装Git、进行相关配置并创建版本库。Git版本库中添加文件Git 的工作就是创建和保存你的项目的快照及与之后的快照进行对比。我们编写一个readme.txt文…

nginx反向代理配置如何去除前缀

使用nginx做反向代理的时候,可以简单的直接把请求原封不动的转发给下一个服务。设置proxy_pass请求只会替换域名,如果要根据不同的url后缀来访问不同的服务,则需要通过如下方法: 方法一:加"/"** server {l…

「作文素材详解」写作必知篇:语言优美不是作文第一要求

语言优美不是作文第一要求“教孩子写作文,老师家长应该先提升自己。”“语言优美不是作文的第一要求。”“如果教孩子写漂亮的违心话,会害了他一辈子。”日前,著名作家肖复兴来到体育东路小学,与广州的一线语文教师交流&#xff0…

华为安装gsm框架_华为nova5怎么下载安装谷歌服务助手,安装GMS框架教程

看到不少的华为nova5用户喜欢这个谷歌服务助手,也就是想安装这个GMS框架,可是一直不知道如何下载安装,这个谷歌服务框架是可以在系统软件里面可以删除的一个APK程序,但现在有很多的软件和游戏需要谷歌服务的支持,那咱们…

VMware安装虚拟机并使用NAT模式连接网络

*************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 如果以上内容对你觉得有用,并想获取更多的赚钱方式和免费的技术教程 请关注微信公众号:HB荷包 一个能让你学习技术和赚钱方法的公众号,持续更…

PHPStudy下Apache SSL证书安装教程

一、安装SSL证书的环境 Apache安装目录:E:phpStudyPHPTutorialApache 以上为windows下测试SSL证书安装的目录,具体目录请根据自己的实际环境! 二、获取SSL证书 成功在沃通申请SSL证书后,会得到一个压缩包文件,解压后得到四个文件&…

laravel 集成采集_新版2020 Laravel采集网站程序

环境:php5.6数据库:mysql5.5集成环境软件:护卫神apache这套程序是520.ag 的网站很早的程序了是去年还是前年 应该是前年免费采集网站 但是经常挂 其实他网站挂和服务器没有多大关系 是程序没有作好优化这套程序可以大家做起来 自己用就可以了 放出去免费采集的话 网站容易死程…

详解模板方法设计模式

分享一波:程序员赚外快-必看的巅峰干货 概念 定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的重复代码全部在父类里面,不同业务的,使用抽象方法,抽取给子类进…

怎么从已有文件中挑选需要的文字重新生成新文件_CAD问题全面解答(几乎涵盖了CAD使用的全部问题)...

1.【CTrlN无效时之解决办法】众所周知CTRLN是新建命令但有时候CTRLN则出现选择面板这时只需到OP选项里调下设置操作:OP(选项)------系统-------右侧有一个启动(A显示启动对话框B不显示启动对话框)选择A则新建命令有效,反则无效2.【Ctrl键无效之解决办法】…

中国官方要求进一步加强中资商业银行境外机构合规管理

中新社北京1月22日电 (记者 王恩博)为推动在境外设有经营性机构的中资商业银行进一步优化集团合规管理体系,健全跨境合规管理机制,提高跨境合规管理有效性,实现境外机构安全稳健运行,中国银保监会22日发布《关于加强中资商业银行境…