众所周知大型网站都是并发支持,用到最多的也是生产者与消费者模式。
- 生产消费者模型
生产者消费者模型具体来讲,就是在一个系统中,存在生产者和消费者两种角色,他们通过内存缓冲区进行通信,生产者生产消费者需要的资料,消费者把资料做成产品。
,譬如注册用户这种服务,它可能解耦成好几种独立的服务(账号验证,邮箱验证码,手机短信码等)。它们作为消费者,等待用户输入数据,在前台数据提交之后会经过分解并发送到各个服务所在的url,分发的那个角色就相当于生产者。消费者在获取数据时候有可能一次不能处理完,那么它们各自有一个请求队列,那就是内存缓冲区了。做这项工作的框架叫做消息队列。
- 生产者消费者模型的实现
生产者是一堆线程,消费者是另一堆线程,内存缓冲区可以使用List数组队列,数据类型只需要定义一个简单的类就好。关键是如何处理多线程之间的协作。这其实也是多线程通信的一个范例。
在这个模型中,最关键就是内存缓冲区为空的时候消费者必须等待,而内存缓冲区满的时候,生产者必须等待。其他时候可以是个动态平衡。值得注意的是多线程对临界区资源的操作时候必须保证在读写中只能存在一个线程,所以需要设计锁的策略。
这下来是代码:
import java.util.Random;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
/**
* 生产者
* @author Administrator
*
*/
public class Product implements Runnable {
//定义一个标志位,来判定他是执行还是阻塞
private volatile boolean isRunning = true;
//队列
private BlockingQueue<PCData1> queue;//内存缓存区区
private static AtomicInteger count = new AtomicInteger();//原子性
private static final int SLEEPTIME = 1000;
public Product(BlockingQueue<PCData1> queue) {
super();
this.queue = queue;
}
public Product(boolean isRunning, BlockingQueue<PCData1> queue) {
super();
this.isRunning = isRunning;
this.queue = queue;
}
@Override
public void run() {
//首先判断对象的数据是否为空