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中 ...
随机推荐
- np.random.randint()的返回值
返回的是数组而非int 比如返回x,y 为[1][2] 而非1,2 容易在只有一维一列时没有意识到 其他函数的返回值也要注意
- Leetcode(885)- 救生艇
第 i 个人的体重为 people[i],每艘船可以承载的最大重量为 limit. 每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit. 返回载到每一个人所需的最小船数.(保证每个人都 ...
- IP的地址的划分
IP地址的划分是计算机网络中很重要的一个知识点,曾经考过三级,但是长时间不用就会忘掉,现在重新将IP的地址划分整理一遍. 首先IP地址的编址方法经历了三个阶段:分类的IP地址.子网的划分.构成超网 我 ...
- 网络流学习-Ford-Fulkerson
首先我们先解决最大流问题 什么是最大流问题呢 根据我的理解,有一个源点s,汇点t,s可以通过一个网络(雾)流向汇点t 但是每一条边都有他的最大传输容量限制,那么我们的任务是,如何分配流量使得..从s流 ...
- Linux下开发STM32单片机
一开始学习51单片机就是用的MDK这个IDE软件,IDE软件虽然看起来直观好像更加容易入门(因为有界面看起来很形象),但是实际上IDE却是向我们这些入门人员隐藏了背后真实存在的过程,让我们以为编译就是 ...
- free online linux terminal & github cli online
free online linux terminal & github cli online gitpod https://www.gitpod.io/features/ https://bc ...
- H5 下拉刷新、加载更多
H5 下拉刷新.加载更多 demos const autoLoadMore = (url = ``) => { // todo ... } refs xgqfrms 2012-2020 www. ...
- js 实现简单的parseInt和parseFloat
function myParseInt(str: string): number { let result = NaN; for (let i = 0; i < str.length; i++) ...
- Mila Fletcher :其实高度自律的人生并没有那么难养成
在日常生活中,我们经常会发现,不论是学习,考证,工作,都需要坚持付出.但是很多人都没有办法在枯燥的学习过程中持续下去,这通常是因为不够自律导致的.但是尽管大家都知道自律是多么重要,却没有几个人可以真正 ...
- Python数据结构与算法_最长公共前缀(05)
编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow" ...