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中 ...
随机推荐
- cookie,session,token之间的联系与区别
发展史 1.很久很久以前,Web 基本上就是文档的浏览而已, 既然是浏览,作为服务器, 不需要记录谁在某一段时间里都浏览了什么文档,每次请求都是一个新的HTTP协议, 就是请求加响应, 尤其是我不用 ...
- redis运维与开发笔记
- HDU 4280 Island Transport(HLPP板子)题解
题意: 求最大流 思路: \(1e5\)条边,偷了一个超长的\(HLPP\)板子.复杂度\(n^2 \sqrt{m}\).但通常在随机情况下并没有isap快. 板子: template<clas ...
- HDU 4336 Card Collector(状压 + 概率DP 期望)题解
题意:每包干脆面可能开出卡或者什么都没有,一共n种卡,每种卡每包爆率pi,问收齐n种卡的期望 思路:期望求解公式为:$E(x) = \sum_{i=1}^{k}pi * xi + (1 - \sum_ ...
- java之 javassist简单使用
0x01.javassist介绍 什么是javassist,这个词一听起来感觉就很懵,对吧~ public void DynGenerateClass() { ClassPool pool = Cla ...
- Hadoop 3.0 EC技术
Hadoop 3.0 EC技术 EC的设计目标 Hadoop默认的3副本方案需要额外的200%的存储空间.和网络IO开销 而一些较低I/O的warn和cold数据,副本数据的访问是比较少的(hot数据 ...
- vue-parent-child-lifecycle-order
vue-parent-child-lifecycle-order vue parent child lifecycle order live demo https://99kyx.csb.app/ h ...
- how to using js to realize notes feature on the website
how to using js to realize notes feature on the website js & notes demos https://medium.com/brow ...
- TypeScript Learning Paths
TypeScript Learning Paths TypeScript Expert refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以 ...
- Sketch & UI & PS
Sketch & UI & PS app ui https://sketchapp.com/learn https://www.sketch.com/docs/ https://ske ...