Object的wait()
wait()
搭配notify()
,nofityAll()
使用。
线程获取到对象锁之后,执行wait()
就会释放对象锁,同时线程挂起,直到其他线程获取到对象锁并执行notify()
后,线程重新开始运行。
final static Object async = new Object();
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
synchronized (async) {
System.out.println("thread a get async");
try {
System.out.println("thread a start wait");
async.wait();
System.out.println("thread a end wait");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
synchronized (async){
System.out.println("thread b get async");
System.out.println("thread b notify async");
async.notify();
}
}
}).start();
}
输出:
thread a get async
thread a start wait
thread b get async
thread b notify async
thread a end wait
Thread.sleep()
线程获取到对象锁之后,sleep时不会释放对象锁,其他线程也不能获取到对象锁。直到线程sleep
结束,其他线程才能获取到对象锁。
final static Object async = new Object();
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
synchronized (async) {
System.out.println("thread a get async");
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 (async) {
System.out.println("thread b get async");
System.out.println("thread b notify async");
async.notify();
}
}
}).start();
}
输出:
thread a get async
thread a start sleep
thread a end sleep
thread b get async
thread b notify async