并发编程复习(十):master和worker模式
发布日期:2021-11-13 10:21:47
浏览次数:8
分类:技术文章
本文共 4375 字,大约阅读时间需要 14 分钟。
首先说说这个模式的特点与原理,看图:
原理就是master用来管理调度worker并负责结果集的处理,实际开发中你可以任意的开启任意多的worker去执行任务,取决于你的CPU得性能,下面来看看模拟:
任务类:Task:
package com.zkingsoft.masterandworker;/** * @Author Lee_Hoo * @DATE Created in 2017/9/24 * @Description: 任务类 */public class Task { private int id; private String name; private int price; public Task(int id, String name, int price) { this.id = id; this.name = name; this.price = 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; }}调度管理类master:
package com.zkingsoft.masterandworker;import java.util.HashMap;import java.util.Map;import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.ConcurrentLinkedQueue;/** * @Author Lee_Hoo * @DATE Created in 2017/9/24 * @Description: master负责调度worker,以及进行结果集的汇总 */public class Master { //存放任务的并发容器 private ConcurrentLinkedQueue执行任务的类worker:queueTask = new ConcurrentLinkedQueue<>(); //存放worker对象 private HashMap hashMap = new HashMap<>(); //存放执行的结果集 private ConcurrentHashMap resultMap = new ConcurrentHashMap<>(); //将引用传递给worker类 public Master(Worker workers,int workerCount){ workers.setQueueTask(queueTask); workers.setResultMap(resultMap); for (int i = 0; i < workerCount; i++) { hashMap.put("worker"+Integer.toString(i),new Thread(workers)); } } //提交任务方法 public void submit(Task task){ this.queueTask.add(task); } //启动方法 public void execute(){ for (Map.Entry me : hashMap.entrySet()){ me.getValue().start(); } } //判断线程是否执行完毕 public boolean isCompelete(){ for(Map.Entry me : hashMap.entrySet()){ if (me.getValue().getState() != Thread.State.TERMINATED){ return false; } } return true; } public int getResult(){ int res = 0; for (Map.Entry o:resultMap.entrySet()){ res += (int) o.getValue(); } return res; }}
package com.zkingsoft.masterandworker;import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.ConcurrentLinkedQueue;/** * @Author Lee_Hoo * @DATE Created in 2017/9/24 * @Description: 具体工作的worker类 */public class Worker implements Runnable { private ConcurrentLinkedQueue测试类:MainqueueTask; private ConcurrentHashMap resultMap; public void setQueueTask(ConcurrentLinkedQueue queueTask) { this.queueTask = queueTask; } public void setResultMap(ConcurrentHashMap resultMap) { this.resultMap = resultMap; } @Override public void run() { while (true) { Task task = this.queueTask.poll(); if (task==null) break; Object output = handler(task); this.resultMap.put(Integer.toString(task.getId()),output); } } //任务执行的真实代码,实际中可以定义一个空方法,由其子类去真正的执行任务 public Object handler(Task input){ Object output = null; try { Thread.sleep(500); output = input.getPrice(); } catch (InterruptedException e) { e.printStackTrace(); } return output; }}
package com.zkingsoft.masterandworker;import java.util.Random;/** * @Author Lee_Hoo * @DATE Created in 2017/9/24 * @Description: */public class Main { public static void main(String[] args) { Master master = new Master(new Worker(),20); Random random = new Random(); for (int i = 1; i <= 100; i++) { Task task = new Task(i,"任务"+i,random.nextInt(10000)); master.submit(task); } long startTime = System.currentTimeMillis(); master.execute(); while (true){ if (master.isCompelete()){ long end = System.currentTimeMillis()-startTime; int res = master.getResult(); System.out.println("最终结果"+res+";执行耗时"+end+"毫秒"); break; } } }}当我开启10个worker的时候,结果是:
最终结果505935;执行耗时5078毫秒
当我开启20个worker的时候,结果是:
最终结果476217;执行耗时2704毫秒
转载地址:https://blog.csdn.net/Lee_Ho_/article/details/78077853 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月02日 08时01分21秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
【剑指OFFER】50. 第一个只出现一次的字符
2021-06-29
【剑指OFFER】57 - II. 和为s的连续正数序列
2021-06-29
【Java】 用PriorityQueue实现最大最小堆
2021-06-29
【剑指OFFER】49. 丑数
2021-06-29
【力扣】179. 最大数
2021-06-29
【剑指OFFER】56 - I. 数组中数字出现的次数
2021-06-29
天池新人赛-工业蒸汽量预测-排名150
2021-06-29
天池新人实战赛o2o优惠券使用预测-排名181
2021-06-29
资金流入流出预测-挑战Baseline-排名445 /122.17
2021-06-29
第四届工业大数据创新竞赛-注塑成型工艺的虚拟量测和调机优化-决赛排名22
2021-06-29
大数据时代的Serverless工作负载预测-排名80_0.313
2021-06-29
python爬虫爬取_腾讯位置大数据_人口迁徙图16年至今数据
2021-06-29
python爬虫爬取_高德地图_主要城市迁徙意愿排行榜_19年至今数据
2021-06-29
联通手机信令大数据的处理分析与可视化
2021-06-29
CNC机床刀具寿命预测
2021-06-29
Python遗传算法求解TSP旅行商问题——全国主要城市交通最短路径
2021-06-29
LeetCode题解(1114):多线程按序打印(Python)
2021-06-29
LeetCode题解(1122):数组的相对排序(Python)
2021-06-29
LeetCode题解(1128):等价多米诺骨牌对的数量(Python)
2021-06-29
LeetCode题解(1137):计算斐波那契数列(Python)
2021-06-29