Braid信息安全博客 - Web安全|代码审计|安全开发|Java|php|python

【安全开发】 Java基于queue的多线程模拟生产者消费者问题

0x01 并发协作(生产者消费者模型)

对于多线程程序来说,不管任何编程语言,生产者和消费者模型都是最经典的。就像学习每一门编程语言你首先要输出Hello World一样,都是经典的例子。
生产者消费者模型准确的讲应该是”生产者-消费者-仓储”模型,离开了仓储这个介质,生产者和消费者也就没有了必然的联系。
这里使用queue队列作为仓储,将生产者和消费者联系起来并模拟实现一个简单的多线程并发协作的模型

0x02 基于Queue的生产者消费者模型实现

package com.thread;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;

/**
* java基于queue多线程来模拟生产者消费者问题
*
* ProducerConsumer是主类,Producer生产者,Consumer消费者,Queue是商品
*
* @author braid
* @time 2015-09-23
*/

public class ProducerConsumer {
public static void main(String[] args) {
ProducerConsumer pc = new ProducerConsumer();
BlockingQueue<String> queue = new LinkedBlockingQueue<String>(5);
ExecutorService service = Executors.newCachedThreadPool();
Producer p = pc.new Producer("王一", queue);
Consumer c = pc.new Consumer("李二", queue);
service.submit(p);
service.submit(c);
}

/**
* 消费者
*
* @author braid
* @time 2015-09-23
*/

class Consumer extends Thread {
private String name;
private BlockingQueue<String> queue = null;

public Consumer(String name, BlockingQueue<String> queue) {
this.name = name;
this.queue = queue;
}

public void run() {
while (true) {
if (queue.isEmpty())
break;
String product;
try {
product = queue.take();
System.out.println(name + "消费商品:" + product);
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}
}

/**
* 生产者
*
* @author braid
* @time 2015-09-23
*/

class Producer extends Thread {
private String name;
private BlockingQueue<String> queue = null;

public Producer(String name, BlockingQueue<String> queue) {
this.name = name;
this.queue = queue;
}

public void run() {
// while(true)会造成阻塞,应该根据实际需要设定条件
while (true) {
String product = "product" + (int) (Math.random() * 10000);
try {
queue.put(product);
System.out.println(name + "已生产:" + product);
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}

本文由HackBraid整理总结,原文链接:http://www.cnbraid.com/2015/producerconsumer.html,如需转载请联系作者。