java sleep()和wait()的区别
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()的区别相关推荐
- JAVA 中equals()与==的区别
原文地址:http://www.chineselinuxuniversity.net/articles/29594.shtml 值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存 ...
- Java NIO与IO的区别和比较
Java NIO与IO的区别和比较 导读 J2SE1.4以上版本中发布了全新的I/O类库.本文将通过一些实例来简单介绍NIO库提供的一些新特性:非阻塞I/O,字符转换,缓冲以及通道. 一. 介绍NIO ...
- java中Array和ArrayList区别 可以将 ArrayList想象成一种会自动扩增容量的Array
java中Array和ArrayList区别 1)精辟阐述: 可以将 ArrayList想象成一种"会自动扩增容量的Array https://blog.csdn.net/ywjy10280 ...
- JAVA CLASSPATH 和PATH的区别 经典
JAVA CLASSPATH 和PATH的区别 收藏 PATH: 用来指定 java 虚拟机(JVM) 所在在目录,也就是我们最常用的用来编译java源程序的javac.exe 和用来执行 *.cla ...
- java 接口与抽象类的区别
1.概述 一个软件设计的好坏,我想很大程度上取决于它的整体架构,而这个整体架构其实就是你对整个宏观商业业务的抽象框架,当代表业务逻辑的高层抽象层结构 合理时,你底层的具体实现需要考虑的就仅仅是一些算法 ...
- 面试必问一:Java 中 == 和 equals 的区别你知道吗
面试必问一:Java 中 == 和 equals 的区别你知道吗 前言 关于这个问题,一般初中级面试中都会遇到,还记得我当初实习找工作的时候也遇到了这个问题,现在都还记得自己是怎么回答的:== 是基本 ...
- POPTEST老李谈JVM、JRE、JDK、java ee sdk with jdk区别
POPTEST老李谈JVM.JRE.JDK.java ee sdk with jdk区别 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作 ...
- 一文告诉你 Java RMI 和 RPC 的区别
转载自 一文告诉你 Java RMI 和 RPC 的区别 RPC 远程过程调用 RPC(Remote Procedure Call Protocol)远程过程调用协议,通过网络从远程计算机上请求调用 ...
- Java之Socket与HTTP区别
转自: Java之Socket与HTTP区别 - 曹刚 - 博客园我们都知道TCP/IP协议共分四层:①链路层,有时也称作数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接 ...
- Java和JavaScript之间的区别
1.简介 我们将在本文中比较Java语言和JavaScript语言. JavaScript由Netscape开发. 它最初是用于客户端的脚本语言,后来又用作客户端和服务器脚本的语言. Java由Jam ...
最新文章
- android里Conversion to Dalvik format failed with error 1错误的解决
- 【数据】深度学习从“数据集”开始
- 解锁并设置远程登录尝试次数
- 移动APP漏洞自动化检测平台建设
- Chrome一直提示“adobe flash player 因过期而遭阻止” ,如何解决?
- springboot redis token_Spring Boot + Redis + 注解 + 拦截器来实现接口幂等性校验
- 问题“The connection to the server....:6443 was refused - did you specify the right host or port?”的处理!
- hadoop java访问_Hadoop(五)搭建Hadoop客户端与Java访问HDFS集群
- php网页输入框,php网页的输入框显示中文异常
- HID Global推出全新室内定位服务 助力企业优化配置劳动力
- Servlet中上传下载模板代码
- 对中文GB2312编码和解码
- Android P 隐藏状态栏电池图标
- matlab模拟出现较大误差是什么原因,关于使用lsqcurvefit拟合曲线出现误差巨大的问题...
- linux proc文件创建指南
- ps抠图基础篇:最常用的四种抠图方法
- 张凯龙 西北工业大学计算机学院,张凯龙的个人主页-西北工业大学教师个人主页...
- Word页眉设置不同的文字,但是页码按照顺序不变
- Blender游戏开发教程
- ibm服务器面板显示,IBM System x服务器前面板指示灯说明(新版)