Object.wait()与Thread.sleep()的区别

Object.wait()方法

Object.wait()与Object.notify(),Object.nofityAll()需要搭配使用,协作线程之间的通信。

线程获取到对象锁后,当它调用锁的wait()方法,就会释放对象锁,同时线程挂起,直到其他线程获取到对象锁并执行notify()后,线程重新开始运行。

示例

final static Object lock = new Object();
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
synchronized (lock) {
System.out.println("thread a get lock");
try {
System.out.println("thread a start wait");
lock.wait();
System.out.println("thread a end wait");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
synchronized (lock){
System.out.println("thread b get lock");
System.out.println("thread b notify lock");
lock.notify();
}
}
}).start();
}

输出:

thread a get lock
thread a start wait
thread b get lock
thread b notify lock
thread a end wait

Thread.sleep()方法

线程获取到对象锁之后,调用Thread.sleep()时不会释放线程所占有的对象锁,其他线程也不能获取被此线程占用对象锁。直到线程sleep结束,其他线程才能获取到对象锁。

示例

final static Object lock = new Object();
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
synchronized (lock) {
System.out.println("thread a get lock");
try {
System.out.println("thread a start sleep");
Thread.sleep(1000);
System.out.println("thread a end sleep");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
synchronized (lock) {
System.out.println("thread b get lock");
System.out.println("thread b notify lock");
lock.notify();
}
}
}).start();
}

输出:

thread a get lock
thread a start sleep
thread a end sleep
thread b get lock
thread b notify lock


版权声明:著作权归作者所有。

相关推荐

JavaScript里null与undefined的区别与相似点

初次看,null和undefined看似是一样的,但远非如此。 本文将探讨JavaScript中null和undefined的区别和相似之处。null是什么?有两个你应该理解的null特性:null是空的或不存在的值。null必须显式赋值。将null的值赋给a示例:let a = null; console.log(a); // 输出null un

MySQL:datetime与timestamp的区别及使用选择

datetime与timestamp的区别1、存储空间不同在MySQL,timestamp在内部存储为整型,占用4个字节,而datetime占用8个字节。2、存储方式不同timestamp存储时,会从插入时间的客户端时区转换为UTC(世界标准时间)时间存储,而datetime不会做时间的转换直接存储。3、存储的时间范围不同timestamp:UTC时间,1970-01-01 00:00:

Gradle配置implementation、api与compile的区别

自Gradle 3.4开始,compile被废弃,取而代之的是implementation和api两个配置项。掌握这三者的区别实际上就是要清楚什么情况使用implementation替换compile,什么情况下使用api替换compile。implementation替换compile使用implementation配置依赖,对Gradle来说:编译时:不允许外部模块调用此依赖包,除非

[译]Angular构造函数与ngOnInit的本质区别

在Stackoverflow上最受欢迎的其中一个Angular问题是构造函数与ngOnInit的区别,这个问题已经超过了100k的浏览量。在那我回答了此问题,但还是决定在这篇文章展开说明。这个问题的大部分回答以及网络里的文章都是集中在两者在使用上的不同,这里我想给出一个比较全面的比较,挖掘组件初始化的过程。JS/TS语言相关的区别我们先从一个与语言本身有关的最明显的区别开始。ngOnInit只是一