Java并发编程:生产者消费者模式

来源:互联网 发布:细说php csdn 编辑:程序博客网 时间:2024/05/05 23:37

生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,生产者向空间里存放数据,而消费者取用数据。


下面是代码实现:

package com.easyliu.producerconsumer;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.LinkedBlockingQueue;// 生产者class Producer implements Runnable {private LinkedBlockingQueue<Object> queue;public Producer(LinkedBlockingQueue<Object> queue) {this.queue = queue;}@Overridepublic void run() {while (true) {// 死循环try {Object o = new Object();queue.put(o);System.out.println("Producer: " + o);} catch (InterruptedException e) {System.out.println("Producer is interrupted!");}}}}// 消费者class Consumer implements Runnable {private LinkedBlockingQueue<Object> queue;public Consumer(LinkedBlockingQueue<Object> queue) {this.queue = queue;}@Overridepublic void run() {while (true) { // 死循环try {Object o = queue.take();System.out.println("Consumer: " + o);} catch (InterruptedException e) {System.out.println("Consumer is interrupted!");}}}}public class ProducerConsumer {public static void main(String[] args) {LinkedBlockingQueue<Object> queue = new LinkedBlockingQueue<Object>(10);ExecutorService es = Executors.newFixedThreadPool(6);for (int i = 0; i < 3; i++) {es.execute(new Producer(queue));es.execute(new Consumer(queue));}}}



在并发编程中,一般推荐使用阻塞队列,这样实现可以尽量地避免程序出现意外的错误。

阻塞队列使用最经典的场景就是socket客户端数据的读取和解析,读取数据的线程不断将数据放入队列,然后解析线程不断从队列取数据解析。还有其他类似的场景,只要符合生产者-消费者模型的都可以使用阻塞队列。





0 0
原创粉丝点击