Java中实现Consumer-Producer
来源:互联网 发布:留学申请 知乎 编辑:程序博客网 时间:2024/05/18 01:13
问题描述:一个仓库可以存放N件物品。生产者每生产一件产品,将产品放入仓库,仓库满了就停止生产。消费者每次从仓库中去一件物品,然后进行消费,仓库空时就停止消费。
解答:在J2SE1.5中的java.util.concurrent 新功能包提供一些实用的通用类供并行程序使用。其中的BlockingQueue接口及其实现类对于解决[生产者-消费者问题]非常方便。下面是实现的代码(例子摘抄自jdk1.5帮助文档,稍做修改):
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
/**
* @author Rebirth
*/
class Consumer implements Runnable {
private int i=0;
private String sName="";
private final BlockingQueue queue;
Consumer(BlockingQueue q,String sName) { queue = q;this.sName=sName; }
/*
* @see java.lang.Runnable#run()
*/
public void run() {
while(i<5) {
try{
//消费产品
consume(queue.take());
}
catch (InterruptedException ex) {
System.out.println(ex.getMessage());
}
finally{i++;}
}
}
private void consume(Object product){
System.out.println(sName + " consume " + product.toString());
}
}
class Producer implements Runnable {
private int i=0;
private String sName="";
private int iNum=0;
private final BlockingQueue queue;
Producer(BlockingQueue q,String sName) { queue = q;this.sName=sName; }
/* (non-Javadoc)
* @see java.lang.Runnable#run()
*/
public void run() {
while(i<10) {
try{
//生产产品
queue.put(produce());
}catch (InterruptedException ex) {
System.out.println(ex.getMessage());
}finally{i++;}
}
}
private Object produce(){
String sProduct ="p" + (++iNum);
System.out.println(sName + " product " + sProduct);
return sProduct;
}
}
public class Factory {
public static void main(String[] args) {
BlockingQueue q = new ArrayBlockingQueue(10);
Producer p = new Producer(q," p1 ");
Consumer c1 = new Consumer(q," c1 ");
Consumer c2 = new Consumer(q," c2 ");
new Thread(p).start();
new Thread(c1).start();
new Thread(c2).start();
}
}
BlockingQueue是线程安全的,当仓库中已经没有物品而消费者继续往里面取时队列自动进行阻塞。需要注意的是,BlockingQueue是不接受null值的,但尝试将一个null值插入队列,会抛出NullPointerException 例外。
- Java中实现Consumer-Producer
- Java:多线程Producer-Consumer的多种实现
- Java Thread Producer/Consumer
- producer consumer java代码
- JAVA Producer and Consumer
- Java多线程:Producer-Consumer不同的几种实现方式
- Producer-Consumer的Ruby实现
- producer consumer
- producer & consumer
- practical haskell: producer-consumer多线程的实现
- practical haskell: producer-consumer多线程的实现
- spring集成kafka实现producer和consumer
- Producer-Consumer模型:二、如何实现
- spring集成kafka实现producer和consumer
- Java线程之Producer-Consumer Pattern
- java--kafka编程实例--producer和consumer
- Java producer-consumer(生产者/消费者模式)
- Java 多线程设计模式之Producer-Consumer
- 调用系统的打印功能
- 过滤HTML标记,以及清除缓存
- javascript实现AJAX
- 关于UPNP的一些问题
- 在 FreeBSD 上彻底禁用 sendmail
- Java中实现Consumer-Producer
- asp.net中javascript里面调用cs文件里的方法
- “虚拟物品”的本质和法律属性
- 推荐我们站点一些有价值的网络安全维护及服务器安全维护技术的资料,望大家多多支持本站(02/22更新
- [推荐]精品代码收藏(希望对大家有用)
- Java的内存泄漏
- 我能理解黄健翔
- [推荐]高效维护局域网技巧 及网吧疑难杂症解决的“软”方法
- [维护]服务器安全维护技巧七则