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客户端数据的读取和解析,读取数据的线程不断将数据放入队列,然后解析线程不断从队列取数据解析。还有其他类似的场景,只要符合生产者-消费者模型的都可以使用阻塞队列。
下面是代码实现:
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客户端数据的读取和解析,读取数据的线程不断将数据放入队列,然后解析线程不断从队列取数据解析。还有其他类似的场景,只要符合生产者-消费者模型的都可以使用阻塞队列。
相关文章推荐
- java - 流程控制
- Java - 运算符 - 数学工具包java.lang.Math类
- Java编程细节注意
- JDK中设计模式
- 【JAVA集合】EnumMap
- eclipse编码格式设置
- 第六届蓝桥杯 java C组 立方尾不变
- Spring和MyBatis环境整合
- RxJava入门学习笔记
- ## JDK源码--ArrayList
- HDU2017JAVA
- Windows 配置JAVA的环境变量
- SpringMVC 函数返回值问题,返回Json解决方法
- JavaWeb学习总结(一)JavaWeb开发入门
- Java - 基本数据类型
- JavaWeb开发之十八:jsp简单标签开发案例和打包
- 初识Java
- 20145215《Java程序设计》第3周学习总结
- JAVA数据加密——MD5加密,SHA加密,BASE64解密,BASE64加密,HMAC加密
- JDK中的设计模式应用实例