wait和notify一般都是配对使用,wait等待时会释放锁给其他线程,通过notify唤醒后继续执行,经典案例就是生产者和消费者,下面来看下代码
/**
* @description:
* 资源类,生产者和消费者会同时调用这个类,Resource相当于一个货架,最多可以存放10件产品,
* 当货架有产品时,消费者就会调用remove()方法进行消费,没有时进入等待,
* 当货架商品小于10件时,生产者就会往货架上生产产品,多于10件时,就会等待消费者来消费
* @author: kongwc
* @create: 2020-05-13
*/
public class Product {
private int currentNum = 0;
private int maxCount = 10;
/**
* 消费者消费产品
*/
public synchronized void remove(){
if(currentNum > 0){
currentNum--;
System.out.println(Thread.currentThread().getName() + "消耗一件产品,剩余产品数量:" + currentNum);
notifyAll();
}else {
try {
System.out.println("库存不足,等待生产中。。。。。。。");
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/**
* 生产者生产产品
*/
public synchronized void create(){
if(currentNum < maxCount){
currentNum++;
System.out.println(Thread.currentThread().getName() + "生产一件产品,剩余产品数量:" + currentNum);
notifyAll();
}else {
try {
wait();
System.out.println("货架已满,等待消费者消费。。。。。。。。");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
/**
* @description: 生产者
* @author: kongwc
* @create: 2020-05-13
*/
public class Productor extends Thread{
private Product product;
public Productor(Product product){
this.product = product;
}
@Override
public void run() {
while (true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
product.create();
}
}
}
/**
* @description: 消费者
* @author: kongwc
* @create: 2020-05-13
*/
public class Consumor extends Thread {
private Product product;
public Consumor(Product product){
this.product = product;
}
@Override
public void run() {
while (true){
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
product.remove();
}
}
}
/**
* @description: 测试类
* @author: kongwc
* @create: 2020-05-13
*/
public class Test {
public static void main(String[] args) {
Product product = new Product();
Consumor consumor = new Consumor(product);
Productor productor = new Productor(product);
consumor.start();
productor.start();
}
}