多线程设计模式 - 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. Jquery 控制table中的checkbox 相关选中事件

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. 关于记录log日志的几种方法

    最近在记录日志的时候总结了几种方式: 1.使用log4j2记录 2.使用log4j记录 3.使用logback配置,记录前使用 private  final Logger logger = Logge ...

  3. PostgreSQL 自增主键

    1.自增主键:2.创建序列 一.使用SERIAL自增主键 create table test_no( id SERIAL primary key, name ) ); 二.创建序列 INCREMENT ...

  4. Oracle创建表和创建序列和修改,增加sql字段

    一.创建表 create table y_parts_classify( pt_id number(10) not null, pt_name varchar2(1000), update_time ...

  5. Windows常用快捷键与常用命令

    应用窗口: Alt+F4 关闭当前窗口Win+上 最大化当前窗口Win+下 最小化当前窗口WIN+D 最小化所有窗口/还原Win+Tab 切换窗口 常用工具: Win+R 打开运行对话框Win+E 打 ...

  6. linux下ifconfig只剩下lo的解决方法

    运行以下命令,删除旧的网络配置,重新让networkmanager自动配置即可 sudo service network-manager stop sudo rm /var/lib/NetworkMa ...

  7. skywalking 6.1 简明指南

    skywalking 分布式系统的应用程序性能监视工具,专为微服务.云本机架构和基于容器(Docker.K8s.Mesos)架构而设计 背景 随着微服务架构的流行,一些微服务架构下的问题也会越来越突出 ...

  8. 你所不知的VIM强大功能

    1. 可视化区块(Visual Block) (1)cd ~ 切换到自己的家目录(本范例中为root用户) (2)touch test1 test2 建立两个文件做演示(3)last > tes ...

  9. Cuda9.0安装

    CUDA 9.0安装笔记 最近实验室新购买两块K80的GPU.作为好奇的小猪,当然会自报奋勇去配置环境.在这篇博客中将会介绍在centos7下配置CUDA 9.0的步骤. 1. 什么是CUDA? 引用 ...

  10. python 单元测试_读写Excel及配置文件(八)

    一.安装openpyxl模块 openpyxl模块:是用于解决Excel(WPS等均可使用)中扩展名为xlsx/xlsm/xltx/xltm的文件读写的第三方库.xls文件要使用xlwt .wlrd两 ...