并发设计模式之生产者消费者设计模式

主函数:

 1 package com.ietree.basicskill.mutilthread.designpattern.ProducerConsumer;
 2 
 3 import java.util.concurrent.BlockingQueue;
 4 import java.util.concurrent.ExecutorService;
 5 import java.util.concurrent.Executors;
 6 import java.util.concurrent.LinkedBlockingQueue;
 7 
 8 /**
 9  * Created by Administrator on 2017/5/17.
10  */
11 public class Main {
12     public static void main(String[] args) throws Exception {
13         //内存缓冲区
14         BlockingQueue<Data> queue = new LinkedBlockingQueue<Data>(10);
15         //生产者
16         Producer p1 = new Producer(queue);
17         Producer p2 = new Producer(queue);
18         Producer p3 = new Producer(queue);
19         //消费者
20         Consumer c1 = new Consumer(queue);
21         Consumer c2 = new Consumer(queue);
22         Consumer c3 = new Consumer(queue);
23 
24         //创建线程池运行,这是一个缓存的线程池,可以创建无穷大的线程,没有任务的时候不创建线程。空闲线程存活时间为60s(默认值)
25         ExecutorService cachePool = Executors.newCachedThreadPool();
26         cachePool.execute(p1);
27         cachePool.execute(p2);
28         cachePool.execute(p3);
29         cachePool.execute(c1);
30         cachePool.execute(c2);
31         cachePool.execute(c3);
32 
33         try {
34             Thread.sleep(3000);
35         } catch (InterruptedException e) {
36             e.printStackTrace();
37         }
38         p1.stop();
39         p2.stop();
40         p3.stop();
41         try {
42             Thread.sleep(2000);
43         } catch (InterruptedException e) {
44             e.printStackTrace();
45         }
46 //        cachePool.shutdown();
47 //        cachePool.shutdownNow();
48 
49     }
50 }

Producer类:

 1 package com.ietree.basicskill.mutilthread.designpattern.ProducerConsumer;
 2 
 3 import java.util.Random;
 4 import java.util.concurrent.BlockingQueue;
 5 import java.util.concurrent.TimeUnit;
 6 import java.util.concurrent.atomic.AtomicInteger;
 7 
 8 /**
 9  * Created by Administrator on 2017/5/17.
10  */
11 public class Producer implements Runnable {
12 
13     //共享缓存区
14     private BlockingQueue<Data> queue;
15     //多线程间是否启动变量,有强制从主内存中刷新的功能。即时返回线程的状态
16     private volatile boolean isRunning = true;
17     //id生成器
18     private static AtomicInteger count = new AtomicInteger();
19     //随机对象
20     private static Random r = new Random();
21 
22     public Producer(BlockingQueue queue){
23         this.queue = queue;
24     }
25 
26     @Override
27     public void run() {
28         while(isRunning){
29             try {
30                 //随机休眠0 - 1000 毫秒 表示获取数据(产生数据的耗时)
31                 Thread.sleep(r.nextInt(1000));
32                 //获取的数据进行累计...
33                 int id = count.incrementAndGet();
34                 //比如通过一个getData方法获取了
35                 Data data = new Data(Integer.toString(id), "数据" + id);
36                 System.out.println("当前线程:" + Thread.currentThread().getName() + ", 获取了数据,id为:" + id + ", 进行装载到公共缓冲区中...");
37                 if(!this.queue.offer(data, 2, TimeUnit.SECONDS)){
38                     System.out.println("提交缓冲区数据失败....");
39                     //do something... 比如重新提交
40                 }
41             } catch (InterruptedException e) {
42                 e.printStackTrace();
43             }
44         }
45     }
46 
47     public void stop(){
48         this.isRunning = false;
49     }
50 }

Consumer类:

 1 package com.ietree.basicskill.mutilthread.designpattern.ProducerConsumer;
 2 
 3 import java.util.Random;
 4 import java.util.concurrent.BlockingQueue;
 5 
 6 /**
 7  * Created by Administrator on 2017/5/17.
 8  */
 9 public class Consumer implements Runnable {
10     private BlockingQueue<Data> queue;
11 
12     public Consumer(BlockingQueue queue){
13         this.queue = queue;
14     }
15 
16     //随机对象
17     private static Random r = new Random();
18 
19     @Override
20     public void run() {
21         while(true){
22             try {
23                 //获取数据
24                 Data data = this.queue.take();
25                 //进行数据处理。休眠0 - 1000毫秒模拟耗时
26                 Thread.sleep(r.nextInt(1000));
27                 System.out.println("当前消费线程:" + Thread.currentThread().getName() + ", 消费成功,消费数据为id: " + data.getId());
28             } catch (InterruptedException e) {
29                 e.printStackTrace();
30             }
31         }
32     }
33 }

Data类

 1 package com.ietree.basicskill.mutilthread.designpattern.ProducerConsumer;
 2 
 3 /**
 4  * Created by Administrator on 2017/5/17.
 5  */
 6 public class Data {
 7     private String id;
 8     private String name;
 9 
10     public Data(String id, String name){
11         this.id = id;
12         this.name = name;
13     }
14 
15     public String getId() {
16         return id;
17     }
18 
19     public void setId(String id) {
20         this.id = id;
21     }
22 
23     public String getName() {
24         return name;
25     }
26 
27     public void setName(String name) {
28         this.name = name;
29     }
30 
31     @Override
32     public String toString(){
33         return "{id: " + id + ", name: " + name + "}";
34     }
35 }

 

转载于:https://www.cnblogs.com/Dylansuns/p/6869869.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/355575.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cdatabase读取excel第一行数据_pandas读取excel数据并对重复数据进行标记或者删除

pandas读取excel数据并对重复数据进行标记或者删除​mp.weixin.qq.compandas通常在读取excel数据之后&#xff0c;如果需要进行去重&#xff0c;有两种方式&#xff0c;一种是进行标记&#xff0c;另一种是在pandas中直接去重如下图所示&#xff0c;excel数据&#xff1a;&…

二维温度场matlab编程,二维温度场重建算法(价钱可议)

即病态方程的求解&#xff0c;具体问题如下&#xff1a;(1)物理模型矩形区域的物理模型&#xff0c;即辐射传热定律&#xff1a;可转化为&#xff1a;EUT其中&#xff1a;E表示n个壁面单元辐射接收装置各自所接收的辐射能组成的集合。U被称为敏感矩阵&#xff0c;其与第i个气体…

java 7.函数-递归_带有谓词的Java中的函数样式-第2部分

java 7.函数-递归在本文的第一部分中&#xff0c;我们介绍了谓词&#xff0c;这些谓词通过具有返回true或false的单一方法的简单接口&#xff0c;为Java等面向对象的语言带来了函数式编程的某些好处。 在第二部分和最后一部分中&#xff0c;我们将介绍一些更高级的概念&#xf…

apk改之理_一份礼物.apk-O泡果奶的逆向分析

事情起因是震惊全国大学生的1013事件&#xff01;&#xff01;&#xff01;刚好看到社团群里在讨论这个&#xff0c;于是就发挥专业特长分析一下拿到apk ,第一步肯定先放到虚拟机里跑一下看下效果emmm这似曾相识的页面,这熟悉的音量,唯一变化的就是音乐变成了O泡果奶的魔性洗脑…

《java从入门到精通》pdf

下载地址&#xff1a; 网盘下载 内容简介 编辑本书从初学者角度出发&#xff0c;通过通俗易懂的语言、丰富多彩的实例&#xff0c;详细介绍了使用Java语言进行程序开发应该掌握的各方面技术。全书共分28章&#xff0c;包括&#xff1a;初识Java&#xff0c;熟悉Eclipse开发工具…

接口测试php代码,简易 PHP API 测试

简易 PHP API 测试PHP代码/*Author : JamesDate : 2020/3/21Versions: Beta v2HEPL :HTTP POST :1.{ "select": "mock_data", "where": [{ "id": "1" },{ "username": "james" }], "limit": …

哪个线程执行CompletableFuture的任务和回调?

尽管CompletableFuture大约是两年前&#xff08;&#xff01;&#xff09;于2014年3月在Java 8中引入的&#xff0c;但它仍然是一个相对较新的概念。但是&#xff0c;此类不是很广为人知是一件好事&#xff0c;因为它很容易被滥用&#xff0c;尤其是在线程和线程方面。一路涉及…

时区处理总结

我司业务分布在跨时区的多个国家&#xff0c;我在日常积累了较多的时区处理经验&#xff0c;在此分享一下 首先基本概念&#xff0c;时间分为2种 datetime&#xff0c;这是给人读的时间&#xff0c;分时区。如2000-1-1 12:00:00 gmttimestamp&#xff0c;这是unix时间戳&#x…

python彩色螺旋线_解决python彩色螺旋线绘制引发的问题

彩色螺旋线的绘制代码如下&#xff1a; import turtle import time turtle.pensize(2) turtle.bgcolor(black) colors [red, yellow, purple, blue] turtle.tracer(False) for x in range(400): turtle.forward(2*x) turtle.color(colors[x % 4]) turtle.left(91) turtle.trac…

matlab中的logspace,matlab中的logspace(a,b,n)究竟怎么理解,看下例题,谁能详细解给我看...

matlab中的logspace(a&#xff0c;b&#xff0c;n)究竟怎么理解&#xff0c;看下例题&#xff0c;谁能详细解给我看来源:互联网 宽屏版 评论2009-12-07 10:11:30分类: 教育/科学 >> 学习帮助问题描述:vec2logspace(0,10,6)的答案为什么是1.0e010 * 0.0000 0.0000 0.000…

ID3和C4.5分类决策树算法 - 数据挖掘算法(7)

&#xff08;2017-05-18 银河统计&#xff09;决策树(Decision Tree&#xff09;是在已知各种情况发生概率的基础上&#xff0c;通过构成决策树来判断其可行性的决策分析方法&#xff0c;是直观运用概率分析的一种图解法。由于这种决策分支画成图形很像一棵树的枝干&#xff0c…

mysql 聚簇索引和非聚簇索引_图文并茂,说说MySQL索引

点击上方 小伟后端笔记 &#xff0c;选择 星标 公众号重磅资讯、干货&#xff0c;第一时间送达作者&#xff1a;小小木的博客来源&#xff1a;cnblogs.com/wyc1994666/p/10831039.html序开门见山&#xff0c;直接上图&#xff0c;下面的思维导图即是现在要讲的内容&#xff0c;…

mysql数据库日志截断,MySQL基础(十一):查询截取分析

下面是小凰凰的简介&#xff0c;看下吧&#xff01;&#x1f497;人生态度&#xff1a;珍惜时间&#xff0c;渴望学习&#xff0c;热爱音乐&#xff0c;把握命运&#xff0c;享受生活&#x1f497;学习技能&#xff1a;网络 -> 云计算运维 -> python全栈( 当前正在学习中…

component是什么接口_阿里高级技术专家:整洁的应用架构“长”什么样?

很多同学不止一次和我反馈&#xff0c;我们的系统很混乱&#xff0c;主要表现在&#xff1a;应用的层次结构混乱&#xff1a;不知道应用应该如何分层、应该包含哪些组件、组件之间的关系是什么&#xff1b;缺少规范的指导和约束&#xff1a;新加一段业务逻辑不知道放在什么地方…

php把1拆分成三份,【php】位运算如何拆分

举例&#xff0c;比如说下面可以组合成71|2|4; // 7那么比如我给一个15&#xff0c;怎么拆分成&#xff1a;1、2、4、8&#xff0c;或者是任意其他数&#xff0c;怎么进行拆分回答不熟悉php。可以先确定这个数占多少位&#xff0c;比如64或者32等。然后再左移位&#xff0c;按位…

20155202 实验四 Android开发基础

20155202 实验四 Android开发基础 实验内容 1.基于Android Studio开发简单的Android应用并部署测试; 2.了解Android、组件、布局管理器的使用&#xff1b; 3&#xff0e;掌握Android中事件处理机制。 实验要求 第24章&#xff1a;初识Android任务一&#xff1a;完成Hello World…

死信队列和延迟队列_在实践中使用延迟队列

死信队列和延迟队列通常&#xff0c;在某些情况下&#xff0c;当您有某种工作或作业队列时&#xff0c;有必要不立即处理每个工作项或作业&#xff0c;而是要延迟一些时间。 例如&#xff0c;如果用户单击一个按钮来触发要完成的某项工作&#xff0c;而一秒钟后&#xff0c;用户…

python的代码在哪写_python代码在哪里编写

编写python代码&#xff0c;可以在自带的ide中写&#xff0c;也可以使用第三方编辑器&#xff0c;下面介绍几款常见的python IDE 1. VimVim 可以说是 Python 最好的 IDE。Vim 是高级文本编辑器&#xff0c;旨在提供实际的 Unix 编辑器‘Vi’功能&#xff0c;支持更多更完善的特…

nio框架中的多个Selector结构

随着并发数量的提高&#xff0c;传统nio框架采用一个Selector来支撑大量连接事件的管理和触发已经遇到瓶颈&#xff0c;因此现在各种nio框架的新版本都采用多个Selector并存的结构&#xff0c;由多个Selector均衡地去管理大量连接。这里以Mina和Grizzly的实现为例。 在Mina 2…

js 编码 php解码,浅谈php和js中json的编码和解码

php中1)编码$jsonStr json_encode($array)2)解码$arr json_decode($jsonStr)echo json_encode("中文", JSON_UNESCAPED_UNICODE);添加参数&#xff1a;JSON_UNESCAPED_UNICODE即可。测试环境&#xff1a;PHP Version 5.5.36js中1. 编码var str obj.toJSONString()…