sleep()和wait()的区别

1、wait()方法

1.1使用场景

当某个线程获取到锁后,却还是不满足执行的条件,就可以调用对象锁的wait方法,进入等待状态。

直到外在条件满足了,就可以由其它线程调用notify或者notifyAll方法,来唤醒这个线程。

1.2条件

只有已经获取锁的线程,才可以调用锁的wait、notify方法,否则会抛出IllegalMonitorStateException异常。

看如下代码:

@Log4j
public class WaitTest {public static void main(String[] args) {Object lock = new Object();Thread threadA = new Thread(() -> {synchronized (lock) {log.info("获取了锁");try {log.info("休眠一会儿");TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}log.info("调用wait..");try {lock.wait();} catch (InterruptedException e) {e.printStackTrace();}log.info("被唤醒");}}, "A");threadA.start();lock.notify();}
}

输出为:

这是因为:线程A获得锁之后,主动调用wait方法释放了锁和CPU资源,陷入阻塞状态。主线程在没获得锁的情况下,调用notify方法,会抛出异常。

再看如下代码:

@Log4j
public class WaitTest {public static void main(String[] args) {Object lock = new Object();Thread threadA = new Thread(() -> {synchronized (lock) {log.info("获取了锁");try {log.info("休眠一会儿");TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}log.info("调用wait..");try {lock.wait();} catch (InterruptedException e) {e.printStackTrace();}log.info("被唤醒");}}, "A");threadA.start();Thread threadB = new Thread(()->{synchronized (lock) {log.info("获得了锁");log.info("叫醒A");lock.notify();}}, "B");threadB.start();}
}

输出为:

这是因为:线程A调用wait方法主动释放锁,线程B获得了锁,调用了notify方法,才能叫醒线程A。

线程正常运行时的状态是Runnable,调用wait方法之后,变为Waiting状态。那么主动Waiting的线程,被唤醒后,状态一定会由Waiting变为Runnable吗?

答案是不一定的。

看如下代码:

@Log4j
public class WaitTest {public static void main(String[] args) throws InterruptedException {Object lock = new Object();Thread threadA = new Thread(() -> {synchronized (lock) {log.info("获取了锁");try {log.info("休眠一会儿");TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}log.info("调用wait..");try {log.info("wait前的线程状态" + Thread.currentThread().getState());lock.wait();log.info("wait后的线程状态" + Thread.currentThread().getState());} catch (InterruptedException e) {e.printStackTrace();}log.info("被唤醒");}}, "A");threadA.start();TimeUnit.SECONDS.sleep(2);Thread threadB = new Thread(()->{synchronized (lock) {log.info("获得了锁");log.info("叫醒A前,A的状态" + threadA.getState());log.info("叫醒A");lock.notify();log.info("发现还有很多事需要做,先不释放锁");log.info("我在做事过程中,A的状态: " + threadA.getState());try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {e.printStackTrace();}log.info("我做完了");}}, "B");threadB.start();}
}

输出为:

这是因为:线程B调用notify方法后,没有立刻将线程的控制器交出去,线程A被唤醒后,会先变为Blocked,参与锁的竞争,成功竞争到锁后,才会向下执行。

被唤醒的线程需要重新参与锁竞争。

1.2sleep()方法

作用:让当前线程进入指定的休眠时间(单位是毫秒),进入阻塞状态,放弃占有CPU时间片,让给其它线程使用。

public class ThreadTest06 {public static void main(String[] args) {//让当前线程(主线程)进入休眠,睡眠5秒try {Thread.sleep(1000*5);} catch (InterruptedException e) {e.printStackTrace();}//5秒之后执行这里的代码System.out.println("hello world!");}
}

sleep()和wait()的区别

1.sleep属于Thread类;wait属于Object类

2.sleep不会释放锁,也不需要占用锁;wait会释放锁

3.sleep可以在任何地方使用,wait只能在同步方法或同步控制块中使用

【6.20】sleep()和wait()的区别相关推荐

  1. 魅族20和魅族20pro的区别 魅族20和20pro参数对比

    从核心处理器以及存储配置来看,魅族20.魅族20 Pro都搭载了骁龙8Gen2铁三角组合,同时也都提供了12+128G.12+256G.12+512G三种存储规格,起售价分别为2999元和3999元, ...

  2. 1.20和1.21的区别

    冰封王座1.20和1.21有啥区别? 冰封王座1.21更新内容 blizzard发布众玩家期待已久的"冰封王座"patch1.21"!1.21包含单位与物品的平衡性改动 ...

  3. MS SQL Server和MySQL区别

    - 最近在做MS SQL Server转换成MySQL的工作,总结了点经验,跟大家分享一下.同时这些也会在不断更新.也希望大家补充. 1 MySQL支持enum,和set类型,SQL Server不支 ...

  4. fixture详细介绍-作为参数传入,error和failed区别

    前言 fixture是pytest的核心功能,也是亮点功能,熟练掌握fixture的使用方法,pytest用起来才会得心应手! fixture简介 fixture的目的是提供一个固定基线,在该基线上测 ...

  5. mysql与ms sql server_MS SQL Server和MySQL区别

    1 MySQL支持enum,和set类型,SQL Server不支持 2 MySQL不支持nchar,nvarchar,ntext类型 3 MySQL的递增语句是AUTO_INCREMENT,而MS ...

  6. ms-sql是mysql吗_mssql和mysql有哪些区别?

    <mssql和MysqL有哪些区别?>要点: 本文介绍了mssql和MysqL有哪些区别?,希望对您有用.如果有疑问,可以联系我们. 打开以前的笔记,这是一篇老文章了,不过做mssql转换 ...

  7. 20 ubuntu 中科大源_Linux-Ubuntu简单配置-换国内源-中文显示

    Linux-Ubuntu(个人示例使用版本20.04,其余版本区别不大) 好像知乎的动图加载有问题,这个动图应该阔以(*^▽^*)Linux-Ubuntu简单配置-更换国内源-中文设置​www.bil ...

  8. MySQL与SQLServer的区别(一千条语句)

    ER图.分页.差异.Java连接MySQL SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset LIMIT 子句可以被用于强制 ...

  9. 20个JS 小技巧超级实用

    1. 将彻底屏蔽鼠标右键οncοntextmenu="window.event.returnValue=false"<tableborder oncontextmenu=re ...

  10. Oracle中varchar,varchar2,nvarchar,nvarchar2的区别

    -varchar,varchar2 联系: 1.varchar/varchar2用于存储可变长度的字符串 比如varchar(20),存入字符串'abc',则数据库中该字段只占3个字节,而不是20个字 ...

最新文章

  1. C#怎么通过一个按钮Button,实现点击这个按钮可以打开一个文件或者文件夹?
  2. POJ-2828-Buy Tickets
  3. 树莓派3B 安装中文输入法谷歌输入法途中碰到的各种问题
  4. 2016年中国数据安全五大发展趋势
  5. 六十六,完成SpringBoot项目中的员工增删查改功能
  6. 面向对象三个特征总结
  7. java单链表_(java实现)单链表
  8. Python学习笔记:PMT与PV函数
  9. 【英语学习】【Level 07】U05 Best Destination L3 An Australian Adventure
  10. 让你的linux操作系统更加安全
  11. 计算机职业英语一级是什么,计算机职业英语一级.doc
  12. [译]用javascript实现一门编程语言-词法分析
  13. 编译asp.net 2.0项目到dll文件
  14. 16qam星座图 matlab,16qam星形和矩形星座图调制解调matlab代码.doc
  15. 大型仓库进销存管理系统php源代码,多仓版进销存管理系统PHP源码ERP仓库管理系统php网络版进销存源码...
  16. 现代控制工程(二)状态方程的解
  17. idea中html导入背景图片,IDEA设置导入主题样式皮肤,加入背景图片
  18. 手把手教你搭建一台永久运行的个人服务器
  19. java游戏俄罗斯方块_Java俄罗斯方块小游戏
  20. 笔记本电脑里的微信文件数据误删了 如何恢复?

热门文章

  1. Application finished with exit code: 1
  2. 基于EasyAR运动跟踪的室内导航
  3. [转载]新手开车如何判断前后左右的距离
  4. 不降低软件质量,如何有效节省开发成本?
  5. Oracle Spatial研究
  6. UiPath选择日期
  7. 高新技术企业认定代办服务内容及代办多少钱
  8. HEOI2017 游记
  9. 《中国棒球》:少年强棒·崛起之路
  10. mtcnn人脸检测python_基于mtcnn和facenet的实时人脸检测与识别系统开发