上⾯⼀种基于“锁”的⽅式,线程需要不断地去尝试获得锁,如果失败了,再继续尝试。这可能会耗费服务器资源。⽽等待/通知机制是另⼀种⽅式。
Java
多线程的等待/通知机制是基于Object
类的wait()
⽅法和notify()
,notifyAll()
⽅法来实现的。
前⾯我们讲到,⼀个锁同⼀时刻只能被⼀个线程持有。⽽假如线程A现在持有了⼀个锁lock
并开始执⾏,它可以使⽤lock.wait()
让⾃⼰进⼊等待状态。这个时候,lock
这个锁是被释放了的。这时,线程B获得了lock
这个锁并开始执⾏,它可以在某⼀时刻,使
⽤lock.notify()
,通知之前持有lock
锁并进⼊等待状态的线程A,说“线程A你不⽤等了,可以往下执⾏了”。
package com.company;
import java.util.stream.IntStream;
public class WaitAndNotify {
private static Object lock = new Object();
static class ThreadA implements Runnable{
@Override
public void run() {
synchronized (lock){
IntStream.range(1,5).forEach(i->{
System.out.println("ThreadA:"+i);
lock.notify();
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
}
}
static class ThreadB implements Runnable{
@Override
public void run() {
synchronized (lock){
IntStream.range(1,5).forEach(i->{
System.out.println("ThreadB:"+i);
lock.notify();
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
}
}
public static void main(String[] args) throws InterruptedException {
new Thread(new ThreadA()).start();
Thread.sleep(1000);
new Thread(new ThreadB()).start();
}
}
感谢分享