博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
并发编程之生产者消费者模式
阅读量:6452 次
发布时间:2019-06-23

本文共 2420 字,大约阅读时间需要 8 分钟。

hot3.png

生产者消费者模式使用场景:线程之间需要共享数据,并且有可能线程之间生产和消费数据的速度不同或者性能有差异。

本例使用JDK并发包的BlockingQueue作为共享缓冲区

package concurrent;import java.util.concurrent.BlockingQueue;import java.util.concurrent.TimeUnit;import java.util.concurrent.atomic.AtomicInteger;public class Producer implements Runnable {	private BlockingQueue
 queue; private static AtomicInteger count = new AtomicInteger(); public Producer(BlockingQueue
 queue) { this.queue = queue; } @Override public void run() { // TODO Auto-generated method stub while (true) { Thing thing = new Thing(count.incrementAndGet()); try { Thread.sleep(1000);// 模拟处理前期准备 if (!queue.offer(thing, 100, TimeUnit.MILLISECONDS)) { System.out.println("Fail to put " + thing.toString()); } else { System.out.println("Put" + thing.toString()); } } catch (InterruptedException e) { e.printStackTrace(); } } }}
package concurrent;import java.util.concurrent.BlockingQueue;public class Consumer implements Runnable {	private BlockingQueue
 queue; public Consumer(BlockingQueue
 queue) { this.queue = queue; } @Override public void run() { while (true) { try { Thing t = queue.take(); if (t != null) { System.out.println("Get " + t.toString()); Thread.sleep(100);// 模拟处理得到的数据 } } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }}
package concurrent;public class Thing {// 被生产和消费的东西	private final int id;	public Thing(int id) {		this.id = id;	}	@Override	public String toString() {		return "Thing " + id;	}}
package concurrent;import java.util.concurrent.BlockingQueue;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.LinkedBlockingQueue;public class Main {	public static void main(String[] args) {		// TODO Auto-generated method stub		BlockingQueue
 queue = new LinkedBlockingQueue
(20); Producer p1 = new Producer(queue); Producer p2 = new Producer(queue); Producer p3 = new Producer(queue); Consumer c1 = new Consumer(queue); Consumer c2 = new Consumer(queue); Consumer c3 = new Consumer(queue); ExecutorService executor = Executors.newCachedThreadPool(); executor.submit(p1); executor.submit(p2); executor.submit(p3); executor.submit(c1); executor.submit(c2); executor.submit(c3); }}

转载于:https://my.oschina.net/u/1255754/blog/207714

你可能感兴趣的文章
虚拟机centos 同一个tomcat、不同端口访问不同的项目
查看>>
在不花一分钱的情况下,如何验证你的创业想法是否可行?《转》
查看>>
Linux/Android 性能优化工具 perf
查看>>
learn go recursive
查看>>
GitHub使用教程、注册与安装
查看>>
论以结果为导向
查看>>
CODE[VS] 1294 全排列
查看>>
<<The C Programming Language>>讀書筆記
查看>>
如何在目录中查找具有指定字符串的文件(shell)
查看>>
安卓学习笔记2
查看>>
选择排序
查看>>
DotNet(C#)自定义运行时窗体设计器 一
查看>>
P2627 修剪草坪[dp][单调队列]
查看>>
JS详细入门教程(上)
查看>>
Android学习笔记21-ImageView获取网络图片
查看>>
线段树分治
查看>>
git代码冲突
查看>>
lnmp1.3 配置pathinfo---thinkphp3.2 亲测有效
查看>>
查看Linux 系统的配置和增减用户/增减组/增减权限
查看>>
利用android studio 生成 JNI需要的动态库so文件
查看>>