您的位置:首页 > 编程语言 > Java开发

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

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

下面是代码实现:

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;
}

@Override
public 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;
}

@Override
public 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客户端数据的读取和解析,读取数据的线程不断将数据放入队列,然后解析线程不断从队列取数据解析。还有其他类似的场景,只要符合生产者-消费者模型的都可以使用阻塞队列。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息