生产者消费者模型
来源:互联网 发布:stussy淘宝 编辑:程序博客网 时间:2024/06/15 01:19
生产者消费者的核心是不共享内存缓冲区,这里用BlockingQueue当作缓冲区,生产者将提交用户请求,提取用户任务,并装入内存缓冲区
消费者在内存缓冲区中提取并处理任务。
任务:
public final class PcData
{
private final int intData;
public PcData(int d)
{
intData = d;
}
public int getData()
{
return intData;
}
@Override
public String toString()
{
return "PcData [intData=" + intData + "]";
}
}
生产者:
public class Producer implements Runnable
{
private volatile boolean isRunning = true;
private BlockingQueue<PcData> queue;
private static AtomicInteger count = new AtomicInteger();
private static final int SLEEPTIME = 1000;
public Producer(BlockingQueue<PcData> queue2)
{
this.queue = queue2;
}
@Override
public void run()
{
PcData data = null;
Random random = new Random();
System.out.println("start producer id = " + Thread.currentThread().getId());
try
{
while(isRunning)
{
Thread.sleep(random.nextInt(SLEEPTIME));
data = new PcData(count.incrementAndGet());
System.out.println(data + " is put into queue");
if(!queue.offer(data, 2, TimeUnit.SECONDS))
{
System.out.println("failed to put data: " + data);
}
}
}
catch(Exception e)
{
e.printStackTrace();
Thread.currentThread().interrupt();
}
}
public void stop()
{
isRunning = false;
}
}
消费者:
public class Consumer implements Runnable
{
private BlockingQueue<PcData> queue;
private static final int SLEEPTIME = 1000;
public Consumer(BlockingQueue<PcData> queue2)
{
this.queue = queue2;
}
@Override
public void run()
{
// TODO 自动生成的方法存根
System.out.println("start Cosumer id = " + Thread.currentThread().getId());
Random random = new Random();
try
{
while(true)
{
PcData data = queue.take();
if(null != data)
{
int re = data.getData() * data.getData();
System.out.println(MessageFormat.format("{0}*{1}={2}", data.getData(),
data.getData(), re));
Thread.sleep(random.nextInt(SLEEPTIME));
}
}
}
catch(Exception e)
{
e.printStackTrace();
Thread.currentThread().interrupt();
}
}
}
客户:
public class Main
{
public static void main(String[] args) throws InterruptedException
{
BlockingQueue<PcData> queue = new LinkedBlockingQueue<PcData>(10);
Producer producer1 = new Producer(queue);
Producer producer2 = new Producer(queue);
Producer producer3 = new Producer(queue);
Consumer consumer1 = new Consumer(queue);
Consumer consumer2 = new Consumer(queue);
Consumer consumer3 = new Consumer(queue);
ExecutorService service = Executors.newCachedThreadPool();
service.execute(producer1);
service.execute(producer2);
service.execute(producer3);
service.execute(consumer1);
service.execute(consumer2);
service.execute(consumer3);
Thread.sleep(10 * 1000);
producer1.stop();
producer2.stop();
producer3.stop();
Thread.sleep(3000);
service.shutdown();
}
}
- 生产者-消费者模型
- 生产者/消费者模型
- 生产者 消费者模型
- 生产者消费者模型
- 生产者&&消费者模型
- 模拟生产者/消费者模型
- 生产者消费者模型
- 生产者消费者模型
- 生产者与消费者模型
- 生产者/消费者模型
- 生产者与消费者模型
- 生产者/消费者模型
- 生产者消费者模型
- 生产者消费者模型
- 生产者消费者模型
- 生产者消费者模型 ArrayBlockingQueue
- 生产者消费者模型
- 生产者消费者模型 - Storage
- ZOJ
- 解题时候注意的小问题--------数组开小了(导致超时)
- 在python中,如何获取脚本文件所在路径-2
- CSDN如何转载别人的博客
- 闭包与变量的面试题
- 生产者消费者模型
- 解决webview加载过大的图片导致水平滑动的视觉
- 文件上传,表单提交插件
- Android混合开发
- tip7——activity的4种启动模式
- 算法与数据结构绪论
- spring 事件驱动模型简介
- JS知识体系构建--持续更新
- 优化MyEclipse保存页面卡顿