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();// 释放锁时通知其他线程
}
}
}
java sleep()和wait()的区别的更多相关文章
- java 接口和抽象类的区别
java 接口和抽象类的区别抽象类:1.含有抽象方法的类一定为抽象类,反过来抽象类,不一定含有抽象方法:2.抽象类必须用abstract来进行定义,抽象方法也必须用abstract来进行定义:3.抽象 ...
- JDK与Java SE/EE/ME的区别
1. Java SE(Java Platform,Standard Edition). Java SE 以前称为 J2SE.它允许开发和部署在桌面.服务器.嵌入式环境和实时环境中使用的 Java 应用 ...
- java 静态方法和实例方法的区别
转自 java 静态方法和实例方法的区别 静态方法和实例方法的区别主要体现在两个方面: 在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法 ...
- java中ArrayList 、LinkList区别
转自:http://blog.csdn.net/wuchuanpingstone/article/details/6678653 个人建议:以下这篇文章,是从例子说明的方式,解释ArrayList.L ...
- java抽象类与接口的区别及用法
java抽象类与接口的区别及用法 一.抽象类里面的方法可以有实现,但是接口里面的方法确是只能声明. 二.接口是设计的结果 :抽象类是重构的结果 . 三.java不支持多重继承,所以继承抽象类只能继承一 ...
- 【转】java int与integer的区别
java int与integer的区别 int与integer的区别从大的方面来说就是基本数据类型与其包装类的区别: int 是基本类型,直接存数值,而integer是对象,用一个引用指向这个对象 1 ...
- java 中 ==和equals 的区别
Java中equals和==的区别 java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolea ...
- java中equals和==的区别 (转)
java中equals和==的区别 值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中. ==操作比较的是两个变量的值是否相等,对于引 ...
- 【转】Java中equals和==的区别
[转]Java中equals和==的区别 java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boole ...
- java中a++与++a区别
java中a++与++a区别 a++与++a的区别,如果单独使用没有任何区别,如果在运算中就有区别了,a++是先运算在赋值,而++a是先赋值在运算!! 先看a++的代码哦 class demo1 { ...
随机推荐
- Linux中搭建HTTP服务器
1.配置IP [root@localhost~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 BOOTPROTO=static ...
- mysql crete view
CREATE VIEW user_algo_view ASselect `u`.`userId` AS `UserId`,`u`.`userCode` AS `UserCode`,group_conc ...
- MyBatis generator 生成生成dao model mappper
MyBatis GeneratorXML配置文件参考 在最常见的用例中,MyBatis Generator(MBG)由XML配置文件驱动. 配置文件告诉MBG: 如何连接到数据库 什么对象要生成,以及 ...
- 解决ubuntu 无法挂载移动硬盘问题 unknown filesystem type 'exfat'
Ubuntu 13.10 或以上 安装exfat-fuse: sudo apt-get install exfat-fuse Ubuntu 13.04 或以下 sudo apt-add-reposit ...
- 我的Android进阶之旅------>如何解决Android 5.0中出现的警告: Service Intent must be explicit:
我的Android进阶之旅-->如何解决Android 5.0中出现的警告: java.lang.IllegalArgumentException: Service Intent must be ...
- (4.8)SET ANSI_NULLS ON、SET QUOTED_IDENTIFIER ON
T-SQL支持在与空值进行比较时,允许比较运算符返回 TRUE 或 FALSE. 通过设置 ANSI_NULLS OFF 可将此选项激活.当 ANSI_NULLS 为 OFF 时,如果 ColumnA ...
- 在Web上运行Linux—js/linux模拟器
一个叫Fabrice Bellard 的程序员写了一段Javascript在Web浏览器中启动Linux(原网页,我把这个网页iframe在了下面),目前,你只能使用Firefox 4和Chrome ...
- hexo+yilia主题博客如何添加图标icon
1. 先去比特虫网站做icon图标 2. 图片放到hexo/source/img文件夹下 3. 找到hexo\themes\modernist\layout_partial\head.ejs,设置为 ...
- alter session set events
.alter session set events 一.Oracle跟踪文件 Oracle跟踪文件分为三种类型,一种是后台报警日志文件,记录数据库在启动.关闭和运行期间后台进程的活动情况,如表空 ...
- beego——参数配置
beego目前支持INI.XML.JSON.YAML格式的配置文件解析,但是默认采用了INI格式解析,用户可以通过简单的配置就可以获得很大的灵活性. 一.默认配置解析 beego 默认会解析当前应用下 ...