package com.xiaozhao.juc;
//生产者——消费者模式(Producer Consumer Model)
public class PCM {
public static void main(String[] args) {
Data data = new Data();
new Thread(()->{
for (int i = 0; i < 20; i++) {
try {
data.increment();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"A").start();
new Thread(()->{
for (int i = 0; i < 20; i++) {
try {
data.decrement();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"B").start();
new Thread(()->{
for (int i = 0; i < 20; i++) {
try {
data.increment();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"C").start();
new Thread(()->{
for (int i = 0; i < 20; i++) {
try {
data.decrement();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"D").start();
}
}
//线程先根据条件判断是否需要等待——>执行业务——>通知其他线程
class Data{
private int number = 0;
public synchronized void increment() throws InterruptedException {
//这里如果是If就会造成虚假唤醒问题,为了防止虚假唤醒必须用while----官方推荐
while (number != 0){
//等待
this.wait();
}
number++;
System.out.println(Thread.currentThread().getName()+"——>"+number);
//通知其他线程,我执行+1完毕
this.notifyAll();
}
public synchronized void decrement() throws InterruptedException {
//这里如果是If就会造成虚假唤醒问题,为了防止虚假唤醒必须用while----官方推荐
while (number == 0){
//等待
this.wait();
}
number--;
System.out.println(Thread.currentThread().getName()+"——>"+number);
//通知其他线程,我执行-1完毕
this.notifyAll();
}
}
传统Synchronized下的生产者和消费者模式
猜你喜欢
转载自blog.csdn.net/weixin_43562937/article/details/106965086
今日推荐
周排行