管程法
大约 2 分钟Java多线程详解
并发协作模型生产者/消费者模式 管程法
- 生产者:负责生产数据的模块(可能是方法、对象、线程、进程)。
- 消费者:负责处理数据的模块(可能是方法、对象、线程、进程)。
- 缓冲区:消费者不能直接使用生产者的数据,他们之间有个缓冲区。
生产者将生产好的数据放入缓冲区,消费者从缓冲区拿出数据。
管程法:生产者、消费者、产品、缓冲区
public class TestPC {
public static void main(String[] args) {
// 容器
SynContainer container = new SynContainer();
// 生产者
new Productor(container).start();
// 消费者
new Consumer(container).start();
}
}
/**
* 生产者
*/
class Productor extends Thread{
SynContainer container;
public Productor(SynContainer container){
this.container = container;
}
/**
* 生产
*/
@Override
public void run() {
for (int i = 0; i < 100; i++) {
container.push(new Chicken(i));
System.out.println("生产了==>第" + i + "只鸡");
}
}
}
/**
* 消费者
*/
class Consumer extends Thread{
SynContainer container;
public Consumer(SynContainer container){
this.container = container;
}
/**
* 消费
*/
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("消费了===>第" + container.pop().id + "只鸡");
}
}
}
/**
* 产品
*/
class Chicken extends Thread{
/** 产品编号 **/
int id;
public Chicken(int id){
this.id = id;
}
}
/**
* 缓冲区
*/
class SynContainer{
/** 容器大小 **/
Chicken[] chickens = new Chicken[10];
/** 容器计数器 **/
int count = 0;
/**
* 生产者放入产品
*/
public synchronized void push(Chicken chicken){
// 如果容器满了,就需要等待消费者消费
if (count == chickens.length){
// 通知消费者消费,生产者等待
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 如果容器没有满了,就需要丢入产品
chickens[count] = chicken;
count++;
// 可以通知消费者消费
this.notifyAll();
}
/**
* 消费者消费产品
*/
public synchronized Chicken pop(){
// 判断能否消费
if (count == 0){
// 等待生产者生产,消费者等待
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 可以消费
count--;
Chicken chicken = chickens[count];
// 吃完了,通知生产者生产
this.notifyAll();
return chicken;
}
}
生产了==>第0只鸡
生产了==>第1只鸡
生产了==>第2只鸡
生产了==>第3只鸡
生产了==>第4只鸡
生产了==>第5只鸡
生产了==>第6只鸡
生产了==>第7只鸡
生产了==>第8只鸡
生产了==>第9只鸡
生产了==>第10只鸡
消费了===>第4只鸡
生产了==>第11只鸡
消费了===>第10只鸡
生产了==>第12只鸡