简单介绍一下生产消费者模型,如下图:
一般来说,生产消费者模型就是消费者和生产者可以共同操作茶叶仓库这一个共享资源 。打一个比方,生产者生产茶叶供向茶叶市场,消费者在茶叶市场购买茶叶,其中茶叶市场上的茶叶量就是一个共享资源。生产者生产了茶叶就可以让消费者来消费,并且消费者发现茶叶市场没茶了就让生产生产,这是共享资源的一种方式。
在多线程的情况下 ,对共有资源的操作安全性就显得尤为重要,首先我们要对消费者、生产者和仓库进行上锁处理。
消费者:
先拿到仓库的锁,进入仓库,查看仓库中是否有货,有,可进行购买,然后释放仓库锁;如果没有货,通知生产者生产货物,释放仓库锁。
生产者:
进入仓库查看仓库库存是否已满;已满,通知消费者消费,自己进入等待状态,释放仓库锁,未满,生产产品并唤醒消费者,然后释放锁。
仓库:
具有仓库容量的属性,因为是共有资源,还需要加锁,避免出现线程安全问题。
另外为了实现该模型还需用到线程的两个状态:
wait() 会执行该方法的当前的线程进入等待状态 ;
notifyAll() 唤醒所有被wait()的线程
代码如下:
消费者
package com.thread.v5;
public class Consumer implements Runnable{
private WareHouse wareHouse;
public Consumer() {
// TODO Auto-generated constructor stub
}
public Consumer(WareHouse wareHouse) {
super();
this.wareHouse = wareHouse;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true) {
try {
Thread.sleep(3000);
wareHouse.consume();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
生产者
package com.thread.v5;
public class Producer implements Runnable{
private WareHouse wareHouse;
public Producer() {
// TODO Auto-generated constructor stub
}
public Producer(WareHouse wareHouse) {
super();
this.wareHouse = wareHouse;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true) {
try {
Thread.sleep(1000);
wareHouse.produce();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
仓库及main方法
package com.thread.v5;
import java.util.LinkedList;
public class WareHouse{
private int MAX_SIZE = 10;
private LinkedList<Object> list = new LinkedList<>();
public static void main(String[] args) {
WareHouse wareHouse = new WareHouse();
//消费者
Thread c1 = new Thread(new Consumer(wareHouse));
Thread c2 = new Thread(new Consumer(wareHouse));
Thread c3 = new Thread(new Consumer(wareHouse));
//生产者
Thread p1 = new Thread(new Producer(wareHouse));
Thread p2 = new Thread(new Producer(wareHouse));
Thread p3 = new Thread(new Producer(wareHouse));
c1.start();
c2.start();
c3.start();
p1.start();
p2.start();
p3.start();
}
public void produce() {
synchronized (list) {
while(list.size() + 1 > MAX_SIZE) {
System.out.println("生产者"+Thread.currentThread().getName()+
"仓库已满");
try {
list.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
list.add(new Object());
System.out.println("生产者"+Thread.currentThread().getName()+
"生产一个产品,现库存"+list.size());
list.notifyAll();
}
}
public void consume() {
synchronized (list) {
while(list.size() == 0) {
System.out.println("消费者"+Thread.currentThread().getName()
+"仓库为空");
try {
list.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
list.remove();
System.out.println("消费者"+Thread.currentThread().getName()+
"消费一个产品,现库存"+list.size());
list.notifyAll();
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)