Java中实现Consumer-Producer
2006-06-27 18:56
405 查看
问题描述:一个仓库可以存放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第七课 Java的多线程程序进程和线程的概念,实现多线程的两种方式,线程同步的原理,线程的死锁,运用wait和notify来实现producer - consumer关系,线程终止的两种情况。
- Java多线程:Producer-Consumer不同的几种实现方式
- Java:多线程Producer-Consumer的多种实现
- kafka_2.11-0.8.2.1生产者producer的Java实现
- JAVA_Kafka_producer_consumer
- kafka producer java API的实现
- kafka 0.10.0 producer java代码实现
- java spring为ApplicationContext提供有三种实现(dubbo-consumer.xml)
- Java producer-consumer(生产者/消费者模式)
- java160110ProducerConsumerDemo2
- kafka java producer consumer实践
- Java里的生产者-消费者模型(Producer and Consumer Pattern in Java)
- java基础之线程同步实例之Producer与Consumer
- 安装部署(六) Kafka集群安装部署以及Producer和Consumer的JAVA代码测试
- Phtreads实现producer_consumer
- Java Thread Producer/Consumer
- Kafka 0.11.0.0 producer&consumer java API实例
- Java Lock and Condition Example using Producer Consumer Solution
- linux下C语言实现多线程通信—环形缓冲区,可用于生产者(producer)/消费者(consumer)【转】
- 并发编程实现模型之(三)Producer-Consumer模式