java实现生产消费者模式,Java实现生产者和消费者模式

使用Java实现生产者和消费者模式。

package part4;

import java.util.LinkedList;

import java.util.concurrent.LinkedBlockingQueue;

import java.util.concurrent.TimeUnit;

import java.util.concurrent.locks.Condition;

import java.util.concurrent.locks.Lock;

import java.util.concurrent.locks.ReentrantLock;

/**

* 生产者消费者模式的三种实现方式

* @author Administrator

*

*/

public class ProduceAndConsumer {

public static void main(String[] args) {

Storage storage = new LinkedStorage(10, new LinkedList());

//Storage storage = new LockStorage(5, new LinkedList());

//Storage storage = new BlockStorage(5);

//创建多个生成者线程

Thread produce = new Thread(new Produce(storage),"produce");

Thread produce1 = new Thread(new Produce(storage),"produce1");

Thread produce2 = new Thread(new Produce(storage),"produce2");

Thread produce3 = new Thread(new Produce(storage),"produce3");

Thread produce4 = new Thread(new Produce(storage),"produce4");

//创建消费者线程

Thread consumerNew = new Thread(new ConsumerNew(storage),"consumerNew");

produce.start();

produce1.start();

produce2.start();

produce3.start();

produce4.start();

consumerNew.start();

}

}

/**

* 仓库接口

* 模拟产品的生成、消费

* @author Administrator

*

*/

interface Storage{

void put(Object obj);

void get();

}

/**

* 通过block方式实现生产者和消费者模式

* @author Administrator

*

*/

class BlockStorage implements Storage{

private LinkedBlockingQueue products;

private int MAX = 10;

public BlockStorage(int max){

products = new LinkedBlockingQueue(max);

this.MAX = max;

}

@Override

public void put(Object obj) {

if (this.products.size() >= MAX) {

System.out.println("BlockStorage products full! please wait!");

}

try {

products.put(obj);

System.out.println(Thread.currentThread().getName()+" BlockStorage put obj:" + obj+" size:"+products.size());

//生产者线程睡眠3秒

TimeUnit.SECONDS.sleep(3);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

@Override

public void get() {

if (this.products.isEmpty()) {

System.out.println("BlockStorage products empty! please wait!");

}

try {

System.out.println("BlockStorage get obj::" + products.take()

+ " size::" + products.size());

//消费者睡眠1秒

TimeUnit.SECONDS.sleep(1);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

/**

* 用锁实现生产者和消费者模式

* @author Administrator

*

*/

class LockStorage implements Storage{

private Lock lock = new ReentrantLock();

private Condition full = lock.newCondition();

private Condition empty = lock.newCondition();

/**

* 产品列表

*/

private LinkedList products = new LinkedList<>();

private int MAX = 10;

public LockStorage(int max,LinkedList products){

this.MAX = max;

this.products = products;

}

@Override

public void put(Object obj) {

lock.lock();

try{

if (this.products.size() >= MAX) {

System.out.println("LockStorage products full! please wait!");

full.await();

}

products.add(obj);

System.out.println(Thread.currentThread().getName()+" LockStorage put obj:" + obj+" size:"+products.size());

TimeUnit.SECONDS.sleep(3);

// 唤醒其他所有线程

full.signalAll();

empty.signalAll();

} catch (InterruptedException e) {

e.printStackTrace();

}finally{

lock.unlock();

}

}

@Override

public void get() {

lock.lock();

try{

if (this.products.isEmpty()) {

System.out.println("LockStorage products empty! please wait!");

empty.await();

}

System.out.println("LockStorage get obj::" + products.removeLast()

+ " size::" + products.size());

TimeUnit.SECONDS.sleep(2);

// 唤醒其他所有线程

full.signalAll();

empty.signalAll();

}catch (InterruptedException e) {

e.printStackTrace();

}finally{

lock.unlock();

}

}

}

/**

* 使用Synchronized关键字实现生产者和消费者模式

* @author Administrator

*

*/

class LinkedStorage implements Storage{

/**

* 产品列表

*/

private LinkedList products = new LinkedList<>();

private int MAX = 10;

public LinkedStorage(int max,LinkedList products){

this.MAX = max;

this.products = products;

}

public void put(Object obj){

synchronized (products) {

try {

if (this.products.size() >= MAX) {

System.out.println("products full! please wait!");

//将当前线程挂起

products.wait();

}

products.add(obj);

System.out.println(Thread.currentThread().getName()+" put obj:" + obj+" size:"+products.size());

TimeUnit.SECONDS.sleep(3);

} catch (InterruptedException e) {

System.out.println("put interrupted!");

e.printStackTrace();

}

//通知其他线程

products.notify();

}

}

public void get(){

synchronized (products) {

try {

if (this.products.isEmpty()) {

System.out.println("products empty! please wait!");

products.wait();

}

System.out.println("get obj::" + products.removeLast()

+ " size::" + products.size());

TimeUnit.SECONDS.sleep(2);

products.notify();

} catch (InterruptedException e) {

System.out.println("get interrupted!");

e.printStackTrace();

}

}

}

}

class Produce implements Runnable{

private Storage storage;

private volatile int i = 0;

public Produce(Storage storage){

this.storage = storage;

}

@Override

public void run() {

while(true){

storage.put(i++);

}

}

}

class ConsumerNew implements Runnable{

private Storage storage;

public ConsumerNew(Storage storage){

this.storage = storage;

}

@Override

public void run() {

while(true){

storage.get();

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值