1.基本角色
仓库、 生产者、 消费者
2.基本思想
仓库里放着俩引擎,一个生成一个消费。
仓库有一个初始化的最大存放量,当消费者消费完所有的产品,则消费的线程进人等待,然后唤醒所有的生产者线程开始生产。当生成到仓库最大库存就让生产者进入等待,并唤醒消费者进行消费。
3.示例
--仓库--
public class CangKu {
// 仓库最大的容量
private final int MAX_SIZE = 100;
// 载体 双向链表/队列
LinkedList<Object> linkedList = new LinkedList<Object>();
/**
* 生产者方法/引擎
*/
public void produce(int num) {
synchronized (linkedList) {
while(linkedList.size() + num > MAX_SIZE) {
System.out.println("无法生产,大于仓库最大容量");
try {
linkedList.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//消费者消耗部分,while条件不成立,继续执行for
for(int i=1;i<=num;++i) {
linkedList.add(new Object());
}
System.out.println("【已经生产粮食】:" + num + "/t【仓库中粮食总量】:" + linkedList.size());
linkedList.notifyAll();
}
}
/**
* 消费者方法/引擎
*/
public void consumer(int num) {
synchronized(linkedList){
while(linkedList.size() < num) {
System.out.println("粮食不足,停止消费");
try {
linkedList.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//粮食充足可以消费
for(int i=1;i<=num;++i) {
linkedList.remove();
}
System.out.println("【已经消费产品数】:" + num + "/t【现仓库存储量为】:" + linkedList.size());
//唤醒全部生产者
linkedList.notifyAll();
}
}
}
--消费者--
public class Consumers extends Thread{
private int num;
private CangKu cangku;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
Consumers(CangKu cangku){
this.cangku = cangku;
}
public void consumer(int num) {
cangku.consumer(num);
}
@Override
public void run() {
consumer(num);
}
}
--生产者--
public class Producters extends Thread{
private int num;
private CangKu cangku;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
Producters(CangKu cangku){
this.cangku = cangku;
}
public void produce(int num) {
cangku.produce(num);
}
@Override
public void run() {
produce(num);
}
}
main
public class MainTest {
public static void main(String[] args) {
//仓库
CangKu cangku = new CangKu();
Producters producters1 = new Producters(cangku);
producters1.setNum(10);
Producters producters2 = new Producters(cangku);
producters2.setNum(20);
Producters producters3 = new Producters(cangku);
producters3.setNum(30);
Producters producters4 = new Producters(cangku);
producters4.setNum(40);
Producters producters5 = new Producters(cangku);
producters5.setNum(50);
Producters producters6 = new Producters(cangku);
producters6.setNum(60);
Producters producters7 = new Producters(cangku);
producters7.setNum(70);
Producters producters8 = new Producters(cangku);
producters8.setNum(80);
//八个生产者
new Thread(producters1).start();
new Thread(producters2).start();
new Thread(producters3).start();
new Thread(producters4).start();
new Thread(producters5).start();
new Thread(producters6).start();
new Thread(producters7).start();
new Thread(producters8).start();
Consumers consumers1 = new Consumers(cangku);
consumers1.setNum(10);
Consumers consumers2 = new Consumers(cangku);
consumers2.setNum(20);
Consumers consumers3 = new Consumers(cangku);
consumers3.setNum(30);
Consumers consumers4 = new Consumers(cangku);
consumers4.setNum(40);
//四个消费者
new Thread(consumers1).start();
new Thread(consumers2).start();
new Thread(consumers3).start();
new Thread(consumers4).start();
}
}
网友评论