多线程master-worker设计
来源:互联网 发布:php 执行cmd命令 编辑:程序博客网 时间:2024/05/29 11:44
Worker是多线程核心类,所以做成抽象类,具体实现业务由子类来实现,此处为CalcWorker。
整个逻辑为计算从1加到100的实现
Task:
package com.mhm.masterworker;/** * 累加一共有多少钱 * @author Administrator * */public class Task {private int id;private String name;private int price;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getPrice() {return price;}public void setPrice(int price) {this.price = price;}}
Worker
package com.mhm.masterworker;import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.ConcurrentLinkedQueue;public abstract class Worker implements Runnable {protected ConcurrentLinkedQueue<Task> workQueue;protected ConcurrentHashMap<String, Object> resultMap;public void setWorkQueue(ConcurrentLinkedQueue<Task> workQueue) {this.workQueue = workQueue;}public void setResultMap(ConcurrentHashMap<String, Object> resultMap) {this.resultMap = resultMap;}@Overridepublic void run() {while (true) {// poll会得到空Task task = this.workQueue.poll();if(task == null) {break;}handle(task);}}protected abstract void handle(Task task);}
CalcWorker:
package com.mhm.masterworker;public class CalcWorker extends Worker {@Overridepublic void handle(Task task) {Object output = null;try {// 耗时处理Thread.sleep(500);output = task.getPrice();System.out.println(Thread.currentThread().getName() + ", output:" + output);} catch (InterruptedException e) {e.printStackTrace();}super.resultMap.put(String.valueOf(task.getId()), output);}}
Master
package com.mhm.masterworker;import java.util.HashMap;import java.util.Map;import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.ConcurrentLinkedQueue;public class Master {// 装载任务的集合private ConcurrentLinkedQueue<Task> workQueue = new ConcurrentLinkedQueue<>();// 使用hashMap装载所有的worker对象private HashMap<String, Thread> workerMap = new HashMap<>();// 使用ConcurrentHashMap装载worker的并发执行的结果集private ConcurrentHashMap<String, Object> resultMap = new ConcurrentHashMap<>();public Master (Worker worker, int workerCount) {for (int i = 0; i < workerCount; i++) {// Worker worker = new Worker();worker.setWorkQueue(workQueue);worker.setResultMap(resultMap);workerMap.put("节点"+i, new Thread(worker, "tid" + i));}}public void addTask(Task task) {this.workQueue.add(task);}// 启动应用程序,让所有的worker工作public void execute() {for (Map.Entry<String, Thread> me : workerMap.entrySet()) {// 启动线程// System.out.println(me.getKey() + "启动");me.getValue().start();}}public boolean isComplete() {for (Map.Entry<String, Thread> me : workerMap.entrySet()) {if(me.getValue().getState() != Thread.State.TERMINATED) {return false;}}return true;}// 把每个worker的结果累加起来public int getResult() {int r = 0;for (Map.Entry<String, Object> me : resultMap.entrySet()) {int v = (Integer)me.getValue();r = r + v;}return r;}}
Main:
package com.mhm.masterworker;public class Main {public static void main(String[] args) {Master master = new Master(new CalcWorker(), 10);for(int i=0; i<100; i++) {Task t = new Task();t.setId(i);t.setName("任务" + i);t.setPrice(i+1);master.addTask(t);}master.execute();long start = System.currentTimeMillis(); while (true) {if(master.isComplete()) {int a = master.getResult();System.out.println();System.out.println("最终结果:" + String.valueOf(a) + ", 耗时:" + (System.currentTimeMillis() - start));break;}}}}
阅读全文
0 0
- 多线程master-worker设计
- 多线程设计模式-- Master-Worker模式
- Master-Worker模式 多线程设计模式
- 多线程设计模式(Future/Master-Worker)
- Master-Worker设计模式
- Master-Worker设计模式
- 多线程学习之路-学习master-worker设计模式
- java 多线程 master worker模式
- 并行设计模式-Master/Worker
- 并行设计模式-Master/Worker
- Master worker并行设计模式
- 架构之路--多线程下的设计模式 Master worker并行计算模式
- 多线程模式之Master-Worker模式
- 通过多线程模拟实现Master-Worker模式
- 多线程之Master-Worker工作模式学习
- 多线程——worker-master模式
- 多线程编程中的Master-Worker模式
- 并发设计模式之Master-Worker模式
- final修饰符的应用
- <物联网> Android Things 树莓派烧录镜像指南
- web笔记
- 【C++】动态规划:最长递增子序列和建桥问题
- 阻止GDB调试
- 多线程master-worker设计
- K-means算法、高斯混合模型 matlab
- 【程序员周边】程序员系列表情包
- BitmapUtil
- 驱动编程(一),NT
- postgresql----继承表INHERITS PARENT TABLE
- 小程序页面布局之Flexbox布局
- 8. 类型声明,方法,接口
- QQ第三方登录