并发编程复习(十):master和worker模式
发布日期:2021-11-13 10:21:47 浏览次数:2 分类:技术文章

本文共 4139 字,大约阅读时间需要 13 分钟。

首先说说这个模式的特点与原理,看图:


原理就是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  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;
}}

执行任务的类worker:

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  queueTask;
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;
}}
测试类:Main

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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:网络编程复习(一):最原始的BIO网络编程
下一篇:并发编程复习(九):Future模式

发表评论

最新留言

很好
[***.200.74.241]2022年05月27日 17时47分28秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

最新文章

ajax检测超时,jquery – 使用AJAX时检查会话超时 2019-12-17 00:01:52
戴尔T330服务器装win8系统,win8系统安装步骤 2019-12-17 00:01:52
华为怎么修改wifi代理服务器,华为(huawei)路由器无线设置方法 2019-12-17 00:01:52
win2008r2hpc无盘服务器配置,机房无盘系统服务器配置 2019-12-17 00:01:53
伯克利计算机信息学院,全美计算机专业TOP20院校|麻省理工学院|康奈尔大学|斯坦福大学|计算机|加州大学伯克利分校|cornell|高校|伊萨卡|计算机专业|伊利诺伊大学香槟分校... 2019-12-17 00:01:50
职高计算机应用专业数据库试卷,中职计算机应用专业数据库应用技术期中试卷201304new.doc... 2019-12-17 00:01:51
初中计算机认识ppt课程教案,初中信息技术教育教案_认识计算机硬件.ppt 2019-12-17 00:01:51
kibana数据导入导出,从kibana导出到csv / excel 2019-12-17 00:01:51
java swing点击文字打开网站,Java Swing;单击按钮后如何显示文本 2019-12-17 00:01:51
mysql 查session,使用PHP SESSION变量存储MySQL查询结果 2019-12-17 00:01:51
jackson json java对象,使用Jackson将Java对象转换为JSON 2019-12-17 00:01:51
html 中objectn 上传flash 设置透明属性,【flash8 ActionScript】对象 2019-12-17 00:01:49
数据通信与计算机网络答案,数据通信与计算机网络考试试题及答案 2019-12-17 00:01:49
计算机用户修改安全策略,12用户管理安全策略.doc 2019-12-17 00:01:50
末流985和211计算机专业该如何选择,2020年高考,末流985和顶尖211如何选择?关键看这3点... 2019-12-17 00:01:50
html5 tdk,TDK等标签 2019-12-17 00:01:50
html标签库大全,HTML的标签大全. 2019-12-17 00:01:50
阿卡迪亚大学计算机专业好考吗,阿卡迪亚大学很烂吗 2022-02-19
android okhttp3 底层,Android okhttp3 SSL握手底层实现追踪 2022-02-19
android+gallery+优化,Android--从系统Camera和Gallery获取图片优化 2022-02-19