Java多线程中的生产者与消费者模式
创建Factory类(工厂类)
public class Factory {
//商品数量
private int num = 0;
//商品可允许最大值
private static final int NUM_MAX = 100;
//同步生产方法
public synchronized void product() throws InterruptedException {
//获取线程名字
String name = Thread.currentThread().getName();
//判断是否小于最大值
if (num<NUM_MAX) {
//持续生产
num++;
System.out.println(name+"生产了一个商品,还剩下"+num+"个商品");
}else {
System.out.println("仓库已满"+name+"无需生产");
//休眠当前线程
this.wait();
//唤醒销售者线程
this.notify();
}
}
//同步销售方法
public synchronized void sell() throws InterruptedException {
//获取当前线程名称
String name = Thread.currentThread().getName();
//判断商品数量是否大于0
if (num>0) {
//持续销售商品
num--;
System.out.println(name+"销售了一个商品,还剩下"+num+"个商品");
}else {
System.out.println("仓库已空"+name+"无需销售");
//唤醒生产者线程
this.notify();
//睡眠当前线程
this.wait();
}
}
}
创建 ProductRunnable 类(生产者类)
public class ProductRunnable implements Runnable{
//工厂属性
private Factory factory;
//构造函数
public ProductRunnable(Factory factory) {
super();
this.factory = factory;
}
@Override
public void run() {
//创建死循环
while(true) {
try {
//休眠100ms
Thread.sleep(100);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
//调用工厂中的生产方法;
factory.product();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
创建 SellRunnable类(销售者类)
public class SellRunnable implements Runnable{
//工厂属性
private Factory factory;
//构造函数
public SellRunnable(Factory factory) {
super();
this.factory = factory;
}
@Override
public void run() {
// TODO Auto-generated method stub
//创建死循环
while(true) {
try {
//休眠100ms
Thread.sleep(100);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
//调用工厂中的销售方法;
factory.sell();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
测试类
public class Main {
public static void main(String[] args) {
//创建工厂对象
Factory factory = new Factory();
//创建销售任务对象
SellRunnable sellRunnable = new SellRunnable(factory);
//创建生产任务对象
ProductRunnable productRunnable = new ProductRunnable(factory);
//创建线程,并传入线程任务,和设置名称
Thread t0 = new Thread(sellRunnable,"小飞");
Thread t1 = new Thread(sellRunnable,"小焦");
Thread t2 = new Thread(sellRunnable,"小王");
Thread t3 = new Thread(sellRunnable,"小李");
Thread t4 = new Thread(productRunnable,"牛工");
Thread t5 = new Thread(productRunnable,"张工");
Thread t6 = new Thread(productRunnable,"龙哥 ");
Thread t7 = new Thread(productRunnable,"小牛");
//启动线程
t0.start();
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
t6.start();
t7.start();
}
}
编写思路
作用:描绘工厂的生产与销售
分析:
对象:
工厂
剩余商品数量
最大可容纳商品数量
生产的方法
销售的方法
生产人员
死循环
生产
销售人员
死循环
销售
类:
工厂类
属性:
剩余商品数量
最大可容纳商品数量
方法:
生产的方法,一个线程安全的方法
步骤:
1,判断剩余商品数量小于最大可容纳商品数量
剩余商品数量++
提示:谁谁谁生产了一个产品,现在还有xxx个商品
唤醒消费线程
2,剩余商品数量大于等于最大可容纳商品数量
唤醒消费线程
提示:仓库已满,生产人员xxx休息
休眠当前线程
销售的方法,一个线程安全的方法
步骤:
1,判断剩余商品数量大于0
剩余商品数量--
提示:谁谁谁卖出一个产品,现在还有xxx个商品
唤醒生产者线程
2,剩余商品数量小于等于0
唤醒生产者线程
提示:已经无货,销售人员xxx休息
休眠当前线程
生产任务类
死循环调用生产方法
注意:生产任务与销售任务对象的所有的工厂对象为一个对象
销售任务类
死循环调用销售方法
注意:生产任务与销售任务对象的所有的工厂对象为一个对象
环境类
先写main方法
步骤:
1,创建工厂
2,创建生产任务,传入工厂
3,创建销售任务,传入工厂
4,创建生产人员
创建生产人员对象(线程对象),传入生产任务对象
创建生产人员对象(线程对象),传入生产任务对象
创建生产人员对象(线程对象),传入生产任务对象
创建生产人员对象(线程对象),传入生产任务对象
创建生产人员对象(线程对象),传入生产任务对象
...
5,创建销售人员
创建销售人员对象(线程对象),传入销售任务对象
...
6,启动线程