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模式的更多相关文章

  1. Redis 6.0 新特性-多线程连环13问!

    Redis 6.0 来了 在全国一片祥和IT民工欢度五一节假日的时候,Redis 6.0不声不响地于5 月 2 日正式发布了,吓得我赶紧从床上爬起来,学无止境!学无止境! 对于6.0版本,Redis之 ...

  2. 支持多线程的Redis6.0来了

    支持多线程的 Redis 6.0 版本于 2020-05-02 终于发布了,为什么 Redis 忽然要支持多线程?如何开启多线程?开启后性能提升效果如何?线程数量该如何设置?开启多线程后会不会有线程安 ...

  3. 【原】谈谈对Objective-C中代理模式的误解

    [原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...

  4. 彻底理解AC多模式匹配算法

    (本文尤其适合遍览网上的讲解而仍百思不得姐的同学) 一.原理 AC自动机首先将模式组记录为Trie字典树的形式,以节点表示不同状态,边上标以字母表中的字符,表示状态的转移.根节点状态记为0状态,表示起 ...

  5. 制作类似ThinkPHP框架中的PATHINFO模式功能

    一.PATHINFO功能简述 搞PHP的都知道ThinkPHP是一个免费开源的轻量级PHP框架,虽说轻量但它的功能却很强大.这也是我接触学习的第一个框架.TP框架中的URL默认模式即是PathInfo ...

  6. MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息

    MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二 ...

  7. MVVM模式解析和在WPF中的实现(五)View和ViewModel的通信

    MVVM模式解析和在WPF中的实现(五) View和ViewModel的通信 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 M ...

  8. MVVM模式解析和在WPF中的实现(三)命令绑定

    MVVM模式解析和在WPF中的实现(三) 命令绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

  9. MVVM模式和在WPF中的实现(二)数据绑定

    MVVM模式解析和在WPF中的实现(二) 数据绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

随机推荐

  1. uni-app 实战-打包 &#128230; App

    uni-app 实战-打包 App Android & iOS 证书 广告 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问 ...

  2. Sentry & React

    Sentry & React https://docs.sentry.io/platforms/javascript/guides/react/ https://docs.sentry.io/ ...

  3. vue stop event bug

    vue stop event bug [Vue warn]: Error in v-on handler: "TypeError: e.prevntDefault is not a func ...

  4. React render algorithm & Fiber vs Stack

    React render algorithm & Fiber vs Stack React 渲染算法 & Fiber vs Stack https://stackoverflow.co ...

  5. How to enable a local HTTPS website in macOS

    How to enable a local HTTPS website in macOS local SSL certificate http://loclahost:8888 https://loc ...

  6. 你所不知道的 cnblogs

    你所不知道的 cnblogs cnblogs 学院 cnblogs 班级 refs https://academy.cnblogs.com/ https://academy.cnblogs.com/b ...

  7. Node.js Learning Paths

    Node.js Learning Paths Node.js in Action Node.js Expert situations / scenario Restful API OAuth 2.0 ...

  8. Flutter in DartPad

    Flutter in DartPad Gist Sharing https://github.com/dart-lang/dart-pad/wiki/Sharing-Guide https://gis ...

  9. Vue 3.x Composition API

    Vue 3.x Composition API setup 调用时机 创建组件实例,然后初始化 props ,紧接着就调用setup 函数; 从生命周期钩子的视角来看,它会在 beforeCreate ...

  10. js function arguments types

    js function arguments types https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functi ...