Masterwoker模式
1 public class Task {
2
3 private int id;
4 private int price ;
5 public int getId() {
6 return id;
7 }
8 public void setId(int id) {
9 this.id = id;
10 }
11 public int getPrice() {
12 return price;
13 }
14 public void setPrice(int price) {
15 this.price = price;
16 }
17
18 }
19
20
21 public class Master {
22
23 //1 有一个盛放任务的容器
24 private ConcurrentLinkedQueue<Task> workQueue = new ConcurrentLinkedQueue<Task>();
25
26 //2 需要有一个盛放worker的集合
27 private HashMap<String, Thread> workers = new HashMap<String, Thread>();
28
29 //3 需要有一个盛放每一个worker执行任务的结果集合
30 private ConcurrentHashMap<String, Object> resultMap = new ConcurrentHashMap<String, Object>();
31
32 /**
33 * 4 构造方法
34 * @param worker 执行任务的对象
35 * @param workerCount 子任务的大小
36 */
37 public Master(Worker worker , int workerCount) {
38 //每一个Worker对象都需要有Master的引用
39 worker.setWorkQueue(this.workQueue);//workQueue用于任务的领取
40 worker.setResultMap(this.resultMap);//resultMap用于任务的提交
41
42 for (int i = 0; i < workerCount; i ++) {
43 //Key表示每一个Worker的名字,value表示线程执行对象
44 this.workers.put("子任务" + Integer.toString(i), new Thread(worker));
45 }
46
47 }
48
49 //5 需要一个提交任务的方法
50 public void submit(Task task) {
51 this.workQueue.add(task);
52 }
53
54 //6 需要有一个执行的方法,启动所有的worker方法去执行任务
55 public void execute() {
56 for(Map.Entry<String, Thread> me : workers.entrySet()) {
57 me.getValue().start();
58 }
59 }
60
61 //7 判断是否运行结束的方法
62 public boolean isComplete() {
63 for(Map.Entry<String, Thread> me : workers.entrySet()){
64 if(me.getValue().getState() != Thread.State.TERMINATED){
65 return false;
66 }
67 }
68 return true;
69 }
70
71 //8 计算结果方法
72 public int getResult() {
73 int priceResult = 0;
74 for (Map.Entry<String, Object> me : resultMap.entrySet()) {
75 priceResult += (Integer)me.getValue();
76 }
77 return priceResult;
78 }
79
80 }
81
82
83 public class Worker implements Runnable {
84
85 private ConcurrentLinkedQueue<Task> workQueue;
86 private ConcurrentHashMap<String, Object> resultMap;
87
88 public void setWorkQueue(ConcurrentLinkedQueue<Task> workQueue) {
89 this.workQueue = workQueue;
90 }
91
92 public void setResultMap(ConcurrentHashMap<String, Object> resultMap) {
93 this.resultMap = resultMap;
94 }
95
96 @Override
97 public void run() {
98 while(true){
99 Task input = this.workQueue.poll();
100 if (input == null) break;
101 //真正的去做业务处理
102 Object output = handle(input);
103 this.resultMap.put(Integer.toString(input.getId()), output);
104 }
105 }
106
107 private Object handle(Task input) {
108 Object output = null;
109 try {
110 //处理任务的耗时。。 比如说进行操作数据库。。。
111 Thread.sleep(500);
112 output = input.getPrice();
113 } catch (InterruptedException e) {
114 e.printStackTrace();
115 }
116 return output;
117 }
118
119 }
120
121
122 public class Main {
123
124 public static void main(String[] args) {
125
126 Master master = new Master(new Worker(), 20);
127
128 Random r = new Random();
129 for(int i = 1; i <= 100; i++){
130 Task t = new Task();
131 t.setId(i);
132 t.setPrice(r.nextInt(1000));
133 master.submit(t);
134 }
135 master.execute();
136 long start = System.currentTimeMillis();
137
138 while(true){
139 if(master.isComplete()){
140 long end = System.currentTimeMillis() - start;
141 int priceResult = master.getResult();
142 System.out.println("最终结果:" + priceResult + ", 执行时间:" + end);
143 break;
144 }
145 }
146
147 }
148 }
Masterwoker模式的更多相关文章
- Redis 6.0 新特性-多线程连环13问!
Redis 6.0 来了 在全国一片祥和IT民工欢度五一节假日的时候,Redis 6.0不声不响地于5 月 2 日正式发布了,吓得我赶紧从床上爬起来,学无止境!学无止境! 对于6.0版本,Redis之 ...
- 支持多线程的Redis6.0来了
支持多线程的 Redis 6.0 版本于 2020-05-02 终于发布了,为什么 Redis 忽然要支持多线程?如何开启多线程?开启后性能提升效果如何?线程数量该如何设置?开启多线程后会不会有线程安 ...
- 【原】谈谈对Objective-C中代理模式的误解
[原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...
- 彻底理解AC多模式匹配算法
(本文尤其适合遍览网上的讲解而仍百思不得姐的同学) 一.原理 AC自动机首先将模式组记录为Trie字典树的形式,以节点表示不同状态,边上标以字母表中的字符,表示状态的转移.根节点状态记为0状态,表示起 ...
- 制作类似ThinkPHP框架中的PATHINFO模式功能
一.PATHINFO功能简述 搞PHP的都知道ThinkPHP是一个免费开源的轻量级PHP框架,虽说轻量但它的功能却很强大.这也是我接触学习的第一个框架.TP框架中的URL默认模式即是PathInfo ...
- MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息
MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二 ...
- MVVM模式解析和在WPF中的实现(五)View和ViewModel的通信
MVVM模式解析和在WPF中的实现(五) View和ViewModel的通信 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 M ...
- MVVM模式解析和在WPF中的实现(三)命令绑定
MVVM模式解析和在WPF中的实现(三) 命令绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...
- MVVM模式和在WPF中的实现(二)数据绑定
MVVM模式解析和在WPF中的实现(二) 数据绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...
随机推荐
- 一道思维题 &&递归改循环
思路: 比如5 2 12345--> 1245 从3开始,这时候5变成了1.剩下4512,对应1234.只需要找到现在n-1,k中的数对应原来的编号的映射. 比如1-->3 是1+2 mo ...
- 编程方式建视频——GitHub 热点速览 v.21.07
作者:HelloGitHub-小鱼干 假期过半,大家过得如何,吃好喝好了吗?GitHub 很好!本周的 GitHub Trending 又上爆款项目--github1s 装完之后,一秒 GitHub ...
- 力扣1689. 十-二进制数的最少数目-C语言实现-中等难度题
题目 传送门 如果一个十进制数字不含任何前导零,且每一位上的数字不是 0 就是 1 ,那么该数字就是一个 十-二进制数 .例如,101 和 1100 都是 十-二进制数,而 112 和 3001 不是 ...
- shit api & shit antd
shit api & shit antd 代码演示 ??? https://ant.design/components/skeleton-cn/ https://github.com/ant- ...
- 视屏剪辑软件 & free video editor
视屏剪辑软件 & free video editor purpose add animation keyframe to tutorials video vlog demos tutorial ...
- convert image to base64 in javascript
convert image to base64 in javascript "use strict"; /** * * @author xgqfrms * @license MIT ...
- React Native Apps
React Native Apps https://github.com/ReactNativeNews/React-Native-Apps github app https://github.com ...
- Flutter: SliverAppBar 应用程序栏与滚动视图集成,以便它可以根据滚动偏移量在高度上变化
API class _MyHomeState extends State<MyHome> with SingleTickerProviderStateMixin { @override W ...
- NGK全球行伦敦站,SPC推动全球数字金融创新
近日,NGK全球巡回路演在英国的首都伦敦盛大落幕,此次路演有幸邀请到了西欧区块链业界弗洛伊德大咖,NGK方面代表鲍利斯以及英国及其组周边国家社群意见代表马丁内斯等人,总计参与人数达到了数十人. 路演一 ...
- ROS 安装完成后运行小乌龟示例程序
安装ROS成功后,在Beginner Tutorials中有一个简单的示例程序. 在Terminal中运行以下命令: $ roscore 新开一个terminal,运行以下命令,打开小乌龟窗口: $ ...