一. 介绍

需要使用Master-Worker的场景:主线程开了多个子进程(Worker进程)去执行任务时,主线程希望能收集到每个子进程的执行结果。

所以,Master-Worker模式基本上就是:

1.在Master进程中,定义好需要执行的任务集和需要收集的结果集

2.每一个子进程(Worker进程)从任务集中取一个任务执行,将执行结果写入结果集

3.Master根据结果集的内容做相应的处理

模式结构如下图所示:

二. 基本代码实现

Master 进程:

class Master{
private Queue<Integer> workerQueue = new ConcurrentLinkedQueue<Integer>(); private Map<String, Object> resultMap = new HashMap<String,Object>(); private List<Thread> threadList = new ArrayList<Thread>(); public Master(Worker worker){
worker.setWorkerQueue(workerQueue);
worker.setResultMap(resultMap); for(int i=0; i<5; i++){ //比如,开5个子进程
threadList.add(new Thread(worker));
}
} public Map<String, Object> getResultMap(){
return resultMap;
} public void execute(){
for(Thread thread: threadList){
thread.start();
}
} //判断所有子进程是否结束了
public Boolean isCompleted(){
for(Thread thread: threadList){
if(thread.getState() != Thread.State.TERMINATED){
return false;
}
}
return true;
}
}

Worker 进程

class Worker implements Runnable{
private Queue<Integer> workerQueue; private Map<String, Object> resultMap; public void setResultMap(Map map){
this.resultMap = map;
}
public Map<String, Object> getResultMap(){
return resultMap;
}
public void setWorkerQueue(Queue workerQueue){
this.workerQueue = workerQueue;
} public void handle(Object task){
// TODO
/**
* 此处就是任务处理程序
* */
} @Override
public void run() {
// TODO
Object task = workerQueue.poll();
if(task != null){
handle(task);
}
}
}

主函数:

Worker worker = new Worker();
Master master = new Master(worker);
master.execute();
while(!master.isCompleted){
//TODO
//此处可以对master.resultMap进行获取处理,不一定要等所有任务执行完毕
}

从Worker代码中可以看到,Master是将任务集和结果集通过Setter注入到Worker中,任务集用队列存储,是线程安全的。具体的处理就写在Worker的handle方法中

多线程模式之Master-Worker的更多相关文章

  1. 多线程模式之MasterWorker模式

    多线程模式之MasterWorker模式 Master-Worker模式的核心思想是,系统由两类进程协作工作:Master进程和Worker进程.Master进程负责接收和分配任务,Worker进程负 ...

  2. Apache-三种工作模式(prefork/ worker/Event)

    Apache-两种工作模式(prefork/ worker/Event) Apache 2.X  支持插入式并行处理模块,称为多进程处理模块(MPM).在编译apache时必须选择也只能选择一个MPM ...

  3. winform 承载 WCF 注意,可能不是工作在多线程模式下

    [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMo ...

  4. Servlet单实例多线程模式

    http://kakajw.iteye.com/blog/920839 前言:Servlet/JSP技术和ASP.PHP等相比,由于其多线程运行而具有很高的执行效率.由于Servlet/JSP默认是以 ...

  5. Netty-主从Reactor多线程模式的源码实现

    Netty--主从Reactor多线程模式的源码实现 总览 EventLoopGroup到底是什么? EventLoopGroup是一个存储EventLoop的容器,同时他应该具备线程池的功能. gr ...

  6. MySQL MGR 单主模式下master角色切换规则

    MGR单主模式,master节点可读可写,其余节点都是只读.当配置MGR为单主模式,非master节点自动开启super_read_only 当可读可写的节点异常宕机,会进行怎样的切换?在选择新的可写 ...

  7. 多线程模式下高并发的环境中唯一确保单例模式---DLC双端锁

    DLC双端锁,CAS,ABA问题 一.什么是DLC双端锁?有什么用处? 为了解决在多线程模式下,高并发的环境中,唯一确保单例模式只能生成一个实例 多线程环境中,单例模式会因为指令重排和线程竞争的原因会 ...

  8. HTML5之worker开启JS多线程模式及window.postMessage跨域

    worker概述 worker基本使用 window下的postMessage worker多线程的应用 一.worker概述 web worker实际上是开启js异步执行的一种方式.在html5之前 ...

  9. Apache常用2种工作模式prefork和worker比较

    Apache两种常用工作模式:prefork和worker. prefork MPM prefork是一个非线程型的.预派生的MPM,使用多个进程,每个进程在某个确定的时间只单独处理一个连接,效率高, ...

随机推荐

  1. Ryu基本操作的REST API调用演示样例

    import urllib2 import json def get_all_switches(): url = "http://127.0.0.1:8080/v1.0/topology/s ...

  2. 大话html5应用与app应用优缺点

    在这个app横飞的年代,对于整个产品研发团队来讲,高速的迭代,爆炸式的功能追加已经成为了互联网行业的时代标签,以小时甚至分钟为单位的进度度量成为了常态.在这个市场大环境下,浪里淘沙的不单单是商业模式. ...

  3. 转】关于cgi、FastCGI、php-fpm、php-cgi

    首先,CGI是干嘛的?CGI是为了保证web server传递过来的数据是标准格式的,方便CGI程序的编写者. web server(比如说nginx)只是内容的分发者.比如,如果请求/index.h ...

  4. 安卓开发--HttpClient

    package com.zx.httpclient01; import android.app.Activity; import android.os.Bundle; import android.v ...

  5. hdu 3292 No more tricks, Mr Nanguo

    No more tricks, Mr Nanguo Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Jav ...

  6. AIX系统谨慎使用reboot命令

    在客户一次停机维护中,发现了这个问题. 环境是ORACLE 10G RAC for AIX6,使用了HACMP管理共享磁盘. 在停机维护时间段内需要重启主机,当关闭了数据库和CLUSTER后,节点1使 ...

  7. UI Framework-1: Aura Layout Managers

    Layout Managers LayoutManager is a convenient abstraction that separates messy layout heuristics fro ...

  8. vue项目的环境变量

    关于项目中环境变量的总结 背景 项目环境一般分为开发环境,测试环境,线上环境 因为每个环境的接口域名.webpack 配置都是不同的,所以在打包构建时,我们需要区分这些环境,这时就用到了环境变量 在工 ...

  9. 包及常用模块(time、datetime、random、sys)

    什么是包?‘ #官网解释 Packages are a way of structuring Python’s module namespace by using “dotted module nam ...

  10. 紫书 习题 10-9 UVa 294(正约数个数)

    一个数的正约数个数等于这个数的质因数分解后 每一项幂+1的积 因为每个质因数的幂可以为0, 1, 2--(注意可以为0) 所以就每个质因数配一个幂任意组合就可得一个正因数,根据乘法原理可得正约数个数. ...