
并发编程复习(十):master和worker模式
调度管理类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 ConcurrentLinkedQueuequeueTask = new ConcurrentLinkedQueue<>();
//存放worker对象
private HashMaphashMap = new HashMap<>();
//存放执行的结果集
private ConcurrentHashMapresultMap = 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.Entryme : hashMap.entrySet()){
me.getValue().start();
}
}
//判断线程是否执行完毕
public boolean isCompelete(){
for(Map.Entryme : hashMap.entrySet()){
if (me.getValue().getState() != Thread.State.TERMINATED){
return false;
}
}
return true;
}
public int getResult(){
int res = 0;
for (Map.Entryo: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 {测试类:Main
private ConcurrentLinkedQueuequeueTask;
private ConcurrentHashMapresultMap;
public void setQueueTask(ConcurrentLinkedQueuequeueTask) {
this.queueTask = queueTask;
}
public void setResultMap(ConcurrentHashMapresultMap) {
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 {当我开启10个worker的时候,结果是:
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;
}
}
}}
最终结果505935;执行耗时5078毫秒
当我开启20个worker的时候,结果是:
最终结果476217;执行耗时2704毫秒
转载地址:https://blog.csdn.net/Lee_Ho_/article/details/78077853 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
很好
[***.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