多线程生产者消费者模式
生产者消费者模式是线程的经典模式之一,之前看过多个前辈的代码,对于小白来说,感觉还是有些晦涩,花了点时间,整理出一串
代码。本文使用的是wait(),notify()方式。这两个方法皆来自于Object类。
消费者和生产者需要去对产品进行操作,就相当于超市购物一样,生产者向超市提供商品,消费者取走商品,因此,这里需要三个
类:1.超市类(生产和消费的中转站)2.生产者类3.消费者类。
当然,超市也不是可以无限制存储产品的,因此需要设定超市的容量。产品存储需要使用集合(以LinkedList为例),了解了这些
需要掌握的基本信息后就不多废话了,直接上代码
import java.util.LinkedList;
//创建生产产品工厂Factory
class Factory{
private String name;//生产东西的名字,这里举馒头为例(之前看过别人的代码,以生产馒头为例)
/*
* 生成setter getter方法
*/
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/*
* 构造方法
*/
public Factory() {
super();
}
public Factory(String name) {
super();
this.name = name;
}
/*
* 生产的产品需要存放,这里定义一个LinkedList数组,用于存放生产的产品,
* 这里假设仓库存储的最大数量是4个
*/
LinkedList<String> list=new LinkedList<String>();
int num=0;
public synchronized void put(String name) throws InterruptedException{
if(num==4){ //当数量是4,调用wait方法,停止生产
this.wait();
}
list.add(name);
num++;
System.out.println("已经生产成功了,现在仓库里一共有"+list.size()+"件商品"+this.name);//输出标记语句
this.notify();//生产完成后,唤醒其他线程进行竞争cup;(也可以this.notifyAll())
}
public synchronized void cut(String name) throws InterruptedException{
if(num==0){ //当库存是0时,无法消费,需要调用wait();
this.wait();
}
list.remove(name);
num--;
System.out.println("已经消费成功了,现在仓库里一共有"+list.size()+"件商品"+this.name);
this.notify();
}
}
/*
* 生产者线程
* 生产10次
*/
class Product1 extends Thread{
private Factory factory;
public Product1() {
}
public Product1(Factory factory) {
super();
this.factory = factory;
}
public void run(){
try {
for(int i=0;i<10;i++){
factory.put(factory.getName());//调用Factory的生产方法
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/*
* 消费者线程
* 消费10次
*/
class Customer1 extends Thread{
private Factory factory;
public Customer1(Factory factory) {
super();
this.factory = factory;
}
public Customer1() {
super();
}
public void run(){
try {
for(int i=0;i<10;i++){
factory.cut(factory.getName()); //调用Factory的消费方法
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/*
* 测试类
*/
public class Demo1Copy {
public static void main(String[] args) {
Factory factory=new Factory("馒头");
Customer1 c=new Customer1(factory);
Product1 p=new Product1(factory);
c.start();
p.start();
}
}
从结果中不难看出,生产和消费的线程各运行了10次,当num=4;时,生产者等待,num=0时,消费者等待,需要注意的是:
并不一定是完全生产完4件后才会唤醒消费者调用线程,结论中有两张运行结果图,可供大家参考。希望对大家有所帮助。