多线程设计模式 - Master-Worker模式

并发设计模式属于设计优化的一部分,它对于一些常用的多线程结构的总结和抽象。与串行相比并行程序结构通常较为复杂,因此合理的使用并行模式在多线程并发中更具有意义。

1. Master-Worker模式

  • - Master-Worker模式是常用的并行模式。它的核心思想是系统由两类进程协作工作:Master进程和Worker进程。Master负责接收和分配任务,Worker负责处理子任务。当各个Worker子进程处理完成后,会将结果返回给Master,由Master做归纳和总结。
  • - 其好处是能将一个大任务分解成若干个小任务,并行执行,从而提高系统的吞吐量。

示例:下
说明:看类注释即可明了 不明白可以去屎了

 //Task.java
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.java
public class Worker implements Runnable{ private ConcurrentLinkedQueue<Task> workQueue;
private ConcurrentHashMap<String,Object> resultMap; @Override
public void run() {
while(true){
Task input = this.workQueue.poll();
if(input==null)break;
//真正的去做业务处理
Object output = MyWorker.handle(input);
this.resultMap.put(Integer.toString(input.getId()), output);
}
} public static Object handle(Task input){
return null;
} public void setWorkerQueue(ConcurrentLinkedQueue<Task> workQueue) {
this.workQueue=workQueue;
} public void setResultMap(ConcurrentHashMap<String, Object> resultMap) {
this.resultMap=resultMap; }
} //MyWorker.java继承Worker.java,重写handle方法
public class MyWorker extends Worker{ public static Object handle(Task input) {
Object output = null;
try {
//处理task的耗时,可能是数据的加工,也可能是操作数据库
Thread.sleep(500);
output = input.getPrice();
} catch (InterruptedException e) {
e.printStackTrace();
}
return output;
} }
//Master.java *
public class Master { //1 应该有一个承装任务的集合
private ConcurrentLinkedQueue<Task> workQueue = new ConcurrentLinkedQueue<Task>();
//2 使用普通的HashMap去承装所有的worker对象
private HashMap<String,Thread> workers = new HashMap<String,Thread>();
//3 使用一个容器承装每一个worker并发执行的结果集
private ConcurrentHashMap<String,Object> resultMap = new ConcurrentHashMap<String,Object>();
//4 构造方法
public Master(Worker worker,int workerCount){
//每一个worker对象都需要有master的应用workQueue用于任务的领取,resultMap用于任务的提交
worker.setWorkerQueue(this.workQueue);
worker.setResultMap(this.resultMap); for(int i=0;i<workerCount;i++){
//key表示每一个worker的名字,value表示线程执行对象
workers.put("子节点"+Integer.toString(i), new Thread(worker));
}
}
//5 提交方法
public void submit(Task task){
this.workQueue.add(task);
}
//6 需要有一个执行的方法(启动应用程序让所有的worker工作)
public void execute(){
for(Map.Entry<String,Thread> me:workers.entrySet()){
me.getValue().start();
}
}
//8 判断线程是否执行完毕
public boolean isComplete() {
for(Map.Entry<String, Thread> me:workers.entrySet()){
if(me.getValue().getState()!=Thread.State.TERMINATED){
return false;
}
}
return true;
}
//9 返回结果集数据
public int getResult() {
int ret = 0;
for(Map.Entry<String,Object> me:resultMap.entrySet()){
//汇总逻辑
ret+=(Integer)me.getValue();
}
return ret;
}
}
//主函数
public class Main { public static void main(String[] args) {
System.out.println("我的机器可用processor的数量:"+Runtime.getRuntime().availableProcessors());
Master master = new Master(new MyWorker(),10); Random r = new Random();
for(int i=0;i<100;i++){
Task task = new Task();
task.setId(i);
task.setName("任务"+i);
task.setPrice(r.nextInt(1000));
master.submit(task);
}
master.execute(); long start = System.currentTimeMillis();
while(true){
if(master.isComplete()){
long end = System.currentTimeMillis() -start;
int ret = master.getResult();
System.out.println("最终结果:"+ret+",执行耗时:"+end+"毫秒");
break;
}
}
} }

14.多线程设计模式 - Master-Worker模式的更多相关文章

  1. 多线程设计模式——Read-Write Lock模式和Future模式分析

    目录 多线程程序评价标准 任何模式都有一个相同的"中心思想" Read-Write Lock 模式 RW-Lock模式特点 冲突总结 手搓RW Lock模式代码 类图 Data类 ...

  2. 14.java设计模式之命令模式

    基本需求: 一套智能家电,有照明灯.风扇.冰箱.洗衣机,我们只要在手机上安装app就可以控制对这些家电工作 这些智能家电来自不同的厂家,我们不想针对每一种家电都安装一个App分别控制,我们希望只要一个 ...

  3. Java多线程设计模式(4)线程池模式

    前序: Thread-Per-Message Pattern,是一种对于每个命令或请求,都分配一个线程,由这个线程执行工作.它将“委托消息的一端”和“执行消息的一端”用两个不同的线程来实现.该线程模式 ...

  4. 多线程设计模式 : Master-Worker模式

    Master-Worker是常用的并行计算模式.它的核心思想是系统由两类进程协作工作:Master进程和Worker进程.Master负责接收和分配任务,Worker负责处理子任务.当各个Worker ...

  5. 多线程:多线程设计模式(三):Master-Worker模式

    Master-Worker模式是常用的并行模式之一,它的核心思想是,系统有两个进程协作工作:Master进程,负责接收和分配任务:Worker进程,负责处理子任务.当Worker进程将子任务处理完成后 ...

  6. 多线程设计模式(三):Master-Worker模式

    Master-Worker模式是常用的并行模式之一,它的核心思想是,系统有两个进程协作工作:Master进程,负责接收和分配任务:Worker进程,负责处理子任务.当Worker进程将子任务处理完成后 ...

  7. 多线程设计模式 - Future模式

    Future模式是多线程开发中非常常见的一种设计模式,它的核心思想是异步调用.这类似我们日常生活中的在线购物流程,带在购物网看着一件商品时可以提交表单,当订单完成后就可以在家里等待商品送货上门.或者说 ...

  8. 13.多线程设计模式 - Future模式

    多线程设计模式 - Future模式 并发设计模式属于设计优化的一部分,它对于一些常用的多线程结构的总结和抽象.与串行相比并行程序结构通常较为复杂,因此合理的使用并行模式在多线程并发中更具有意义. 1 ...

  9. Master和worker模式

    让和hadoop的设计思想是一样的,Master负责分配任务和获取任务的结果,worker是真正处理业务逻辑的. 使用ConcurrentLikedQueue去承载所有的任务,因为会有多个worker ...

随机推荐

  1. 关于Faster-RCNN训练细节

    Faster RCNN训练: 四部训练法: Faster R-CNN,可以大致分为两个部分,一个是RPN网络,另一个是Fast R-CNN网络,前者是一种候选框(proposal)的推荐算法,而后者则 ...

  2. shell脚本之nginx启动脚本、统计日志字段、for循环实战、跳板机

    1.NGINX启动脚本 #!/bin/bash # chkconfig: 235 32 62 # description: nginx [ -f /etc/init.d/functions ] &am ...

  3. Encryption (hard) CodeForces - 958C3 (树状数组)

    大意: 给定序列$a$, 要求将$a$分成$k$个非空区间, 使得区间和模$p$的和最小, 要求输出最小值. $k$和$p$比较小, 直接暴力$dp$, 时间复杂度是$O(nklogp)$, 空间是$ ...

  4. ASCII、Unicode、UTF-8、UTF-16、GBK、GB2312、ANSI等编码方式简析

    ASCII.Unicode.UTF-8.UTF-16.GBK.GB2312.ANSI等编码方式简析 序言 从各种字节编码方法中,能看到那个计算机发展的洪荒时期的影子. ASCII ASCII码有标准A ...

  5. vue记录错误和警告日志

    https://blog.csdn.net/lucky___star/article/details/95491657 https://blog.csdn.net/weixin_34204057/ar ...

  6. Eclipse集成spring-tool-suite(STS)

    1.官方下载 sts是spring官方在eclipse基础上加了很多插件之后封装的开发工具.sts与eclipse完全一样,但是多了很多插件,比如maven,使用起来更加方便.如果使用eclipse自 ...

  7. python3.7 利用pyhive 连接上hive(亲测可用)

    来python爬虫中,经常会遇到数据的存储问题,如果有大量数据,hive存储是个不错的选择. 那么python如何来连接hive呢?网上有各种教程但是都不是很好用,亲自测试pyhive可用 要求:可用 ...

  8. WebAPI跨域问题处理

    1.按照https://dzone.com/articles/access-control-allow-origin-header-and-the-aspnet文章所述,在程序中配置允许跨域请求. 但 ...

  9. kubeDNS workflow(service registration and discovery)

    Service discovery In k8s, we usually will more than make an application instance, and also the corre ...

  10. 26、Nginx Uwsgi代理

    1.Uwsgi代理基本概述 cgi.fastcgi.wsgi.uwsgi python框架 Django是一个开放源代码的web的框架 Flask是一个使用python编写的轻量级web应用框架 2 ...