java sleep()和wait()的区别?

sleep()和wait()都能阻塞当前线程。

区别1:

sleep()属于Thread类;wait()属于Object类。

区别2:

调用sleep()方法的过程中,线程不会释放对象锁。

调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。

打个比较有味道的比喻:sleep和wait两个小朋友在拉屎,然后老师说你们两个不要拉屎了,wait小朋友乖乖地听话提起裤子从厕所里面出来了;sleep小朋友也很听话,也先不拉屎了,但是呢就是不从厕所出来;老师对sleep小朋友也没办法,只好不管他了,然后一扭头看到wait小朋友脸憋得通红,只得让wait小朋友继续去厕所;此时厕所已经有人了,wait小朋友只好重新排队;sleep小朋友在厕所听到老师走了也就继续他的事业了。

这里的两个小朋友就是线程,厕所就是对象锁。

看个示例程序:

public class MyTest {public static void main(String[] args) throws InterruptedException {Object o = new Object();Thread t1 = new Thread(() -> {synchronized (o) {System.out.println("start t1");try {o.wait();} catch (InterruptedException e) {}System.out.println("end t1");}});Thread t2 = new Thread(() -> {synchronized (o) {System.out.println("start t2");try {o.notify();Thread.sleep(100L);System.out.println("t2 sleep 100 mills");} catch (Exception e) {}}System.out.println("t2 sleep 200 mills");try {Thread.sleep(200L);} catch (InterruptedException e) {}System.out.println("end t2");});t1.start();Thread.sleep(10L);t2.start();}}

执行结果如下:

start t1
start t2
t2 sleep 100 mills
end t1
t2 sleep 200 mills
end t2

两个线程执行过程如下:

1. 线程1先开始执行,获得对象锁o,输出一行字符后随即被wait方法阻塞,释放对象锁o;

2. 线程2开始执行,获得线程1释放的对象锁o,输出一行字符后调用对象锁o的notify方法唤醒线程1;

3. 线程2开始sleep,但此时线程2仍持有对象锁o,线程1虽已被唤醒但无法获得对象锁o只好继续阻塞;

4. 线程2 sleep结束,输出一行字符,释放对象o,随即输出一行字符,然后继续sleep;

5. 线程1得到对象锁,结束阻塞状态,继续执行直到结束;

6. 线程2 sleep结束,继续执行直到结束。

从这个过程中可以了解sleep和wait的区别与使用方法。

再看一个基于wait方法实现的简单锁:

public class MyLock {private boolean flag = false;public void lock() {synchronized (this) {while (flag) {try {wait();// 已经加锁,当前线程需要等待 } catch (InterruptedException e) {}}flag = true;}}public void unlock() {synchronized (this) {flag = false;notifyAll();// 释放锁时通知其他线程
        }}
}

转载于:https://www.cnblogs.com/amunote/p/10223122.html

java sleep()和wait()的区别相关推荐

  1. JAVA 中equals()与==的区别

    原文地址:http://www.chineselinuxuniversity.net/articles/29594.shtml 值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存 ...

  2. Java NIO与IO的区别和比较

    Java NIO与IO的区别和比较 导读 J2SE1.4以上版本中发布了全新的I/O类库.本文将通过一些实例来简单介绍NIO库提供的一些新特性:非阻塞I/O,字符转换,缓冲以及通道. 一. 介绍NIO ...

  3. java中Array和ArrayList区别 可以将 ArrayList想象成一种会自动扩增容量的Array

    java中Array和ArrayList区别 1)精辟阐述: 可以将 ArrayList想象成一种"会自动扩增容量的Array https://blog.csdn.net/ywjy10280 ...

  4. JAVA CLASSPATH 和PATH的区别 经典

    JAVA CLASSPATH 和PATH的区别 收藏 PATH: 用来指定 java 虚拟机(JVM) 所在在目录,也就是我们最常用的用来编译java源程序的javac.exe 和用来执行 *.cla ...

  5. java 接口与抽象类的区别

    1.概述 一个软件设计的好坏,我想很大程度上取决于它的整体架构,而这个整体架构其实就是你对整个宏观商业业务的抽象框架,当代表业务逻辑的高层抽象层结构 合理时,你底层的具体实现需要考虑的就仅仅是一些算法 ...

  6. 面试必问一:Java 中 == 和 equals 的区别你知道吗

    面试必问一:Java 中 == 和 equals 的区别你知道吗 前言 关于这个问题,一般初中级面试中都会遇到,还记得我当初实习找工作的时候也遇到了这个问题,现在都还记得自己是怎么回答的:== 是基本 ...

  7. POPTEST老李谈JVM、JRE、JDK、java ee sdk with jdk区别

    POPTEST老李谈JVM.JRE.JDK.java ee sdk with jdk区别 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作 ...

  8. 一文告诉你 Java RMI 和 RPC 的区别

    转载自  一文告诉你 Java RMI 和 RPC 的区别 RPC 远程过程调用 RPC(Remote Procedure Call Protocol)远程过程调用协议,通过网络从远程计算机上请求调用 ...

  9. Java之Socket与HTTP区别

    转自: Java之Socket与HTTP区别 - 曹刚 - 博客园我们都知道TCP/IP协议共分四层:①链路层,有时也称作数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接 ...

  10. Java和JavaScript之间的区别

    1.简介 我们将在本文中比较Java语言和JavaScript语言. JavaScript由Netscape开发. 它最初是用于客户端的脚本语言,后来又用作客户端和服务器脚本的语言. Java由Jam ...

最新文章

  1. android里Conversion to Dalvik format failed with error 1错误的解决
  2. 【数据】深度学习从“数据集”开始
  3. 解锁并设置远程登录尝试次数
  4. 移动APP漏洞自动化检测平台建设
  5. Chrome一直提示“adobe flash player 因过期而遭阻止” ,如何解决?
  6. springboot redis token_Spring Boot + Redis + 注解 + 拦截器来实现接口幂等性校验
  7. 问题“The connection to the server....:6443 was refused - did you specify the right host or port?”的处理!
  8. hadoop java访问_Hadoop(五)搭建Hadoop客户端与Java访问HDFS集群
  9. php网页输入框,php网页的输入框显示中文异常
  10. HID Global推出全新室内定位服务 助力企业优化配置劳动力
  11. Servlet中上传下载模板代码
  12. 对中文GB2312编码和解码
  13. Android P 隐藏状态栏电池图标
  14. matlab模拟出现较大误差是什么原因,关于使用lsqcurvefit拟合曲线出现误差巨大的问题...
  15. linux proc文件创建指南
  16. ps抠图基础篇:最常用的四种抠图方法
  17. 张凯龙 西北工业大学计算机学院,张凯龙的个人主页-西北工业大学教师个人主页...
  18. Word页眉设置不同的文字,但是页码按照顺序不变
  19. Blender游戏开发教程
  20. ibm服务器面板显示,IBM System x服务器前面板指示灯说明(新版)

热门文章

  1. 汇编实现: C库常见函数,串操作指令作用
  2. 【网络流24题】分配问题 最小最大费用最大流
  3. 由内而外 多项国产自主先进设计
  4. SqlServer之xp_cmdshell_使用以及配置(转)
  5. Prototype实例代码推荐
  6. 【转载】Chrome 0day漏洞:不要用Chrome查看pdf文件
  7. Wcf传递的参数实际不为空,但是接收时显示为空。
  8. Spring(十六)之MVC框架
  9. mysql(一主从从)
  10. 黑马程序员 oc中的类与对象