单生产者单消费者模式
生产者消费者模型是一个经典的问题,其主要有3部分构成:生产者、阻塞队列和消费者。如下图所示:
生产者消费者模式,可以在一定程度上面做到程序之间的模块解耦。但是还有一个主要的特性,就是它可以通过阻塞队列来协调生产者和消费者的处理速率不同的问题。下面给出一个简单的Demo:
PCData:用于传输的数据
public final class PCData {private final int intData;public PCData(int intData) {this.intData = intData;}public PCData(String intData) {this.intData = Integer.parseInt(intData);}public int getIntData() {return intData;}@Overridepublic String toString() {return "PCData [intData=" + intData + "]";}}
Producer:生产者
public class Producer implements Runnable {private volatile boolean isRunning = true;private BlockingQueue queue;//内存缓冲区private static AtomicInteger count = new AtomicInteger();// 总数private static final int SLEEPTIME = 1000;public Producer(BlockingQueue queue) {this.queue = queue;}@Overridepublic void run() {PCData data = null;System.out.println("start producer id = " + Thread.currentThread().getId());try {while(isRunning) {Thread.sleep(SLEEPTIME);data = new PCData(count.getAndIncrement());// 构造任务数据System.out.println(data + " is put into queue");if(!queue.offer(data, 2, TimeUnit.SECONDS)) {// 提交任务到缓冲区System.err.println("failed to offer data: "+ data);}}} catch (Exception e) {e.printStackTrace();Thread.currentThread().interrupt();}}public void stop(){this.isRunning = false;}}
Customer:消费者
public class Customer implements Runnable {private BlockingQueue queue; // 内存缓冲区private static final int SLEEPTIME = 1000;public Customer(BlockingQueue queue) {this.queue = queue;}@Overridepublic void run() {System.out.println("start Consumer id = " + Thread.currentThread().getId());Random r = new Random();try {while (true) {PCData data = queue.take();// 提取任务if (null != data) {int re = data.getIntData() * data.getIntData();System.out.println(MessageFormat.format("{0}*{1}={2}