多线程模式之Master-Worker
一. 介绍
需要使用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的更多相关文章
- 多线程模式之MasterWorker模式
多线程模式之MasterWorker模式 Master-Worker模式的核心思想是,系统由两类进程协作工作:Master进程和Worker进程.Master进程负责接收和分配任务,Worker进程负 ...
- Apache-三种工作模式(prefork/ worker/Event)
Apache-两种工作模式(prefork/ worker/Event) Apache 2.X 支持插入式并行处理模块,称为多进程处理模块(MPM).在编译apache时必须选择也只能选择一个MPM ...
- winform 承载 WCF 注意,可能不是工作在多线程模式下
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMo ...
- Servlet单实例多线程模式
http://kakajw.iteye.com/blog/920839 前言:Servlet/JSP技术和ASP.PHP等相比,由于其多线程运行而具有很高的执行效率.由于Servlet/JSP默认是以 ...
- Netty-主从Reactor多线程模式的源码实现
Netty--主从Reactor多线程模式的源码实现 总览 EventLoopGroup到底是什么? EventLoopGroup是一个存储EventLoop的容器,同时他应该具备线程池的功能. gr ...
- MySQL MGR 单主模式下master角色切换规则
MGR单主模式,master节点可读可写,其余节点都是只读.当配置MGR为单主模式,非master节点自动开启super_read_only 当可读可写的节点异常宕机,会进行怎样的切换?在选择新的可写 ...
- 多线程模式下高并发的环境中唯一确保单例模式---DLC双端锁
DLC双端锁,CAS,ABA问题 一.什么是DLC双端锁?有什么用处? 为了解决在多线程模式下,高并发的环境中,唯一确保单例模式只能生成一个实例 多线程环境中,单例模式会因为指令重排和线程竞争的原因会 ...
- HTML5之worker开启JS多线程模式及window.postMessage跨域
worker概述 worker基本使用 window下的postMessage worker多线程的应用 一.worker概述 web worker实际上是开启js异步执行的一种方式.在html5之前 ...
- Apache常用2种工作模式prefork和worker比较
Apache两种常用工作模式:prefork和worker. prefork MPM prefork是一个非线程型的.预派生的MPM,使用多个进程,每个进程在某个确定的时间只单独处理一个连接,效率高, ...
随机推荐
- mac鼠标滚动方向自然问题
mac使用鼠标的时候滚轮方向和Windows是相反的.假设不勾选滚动方向自然,那么触摸板使用不爽. 解决的方法: 1.打开http://pilotmoon.com/scrollreverser/,下载 ...
- BootStrap有用代码片段(持续总结)
> 如题.持续总结自己在使用BootStrap中遇到的问题.并记录解决方法.希望能帮到须要的小伙伴 1.bootstrap上下布局.顶部固定下部填充 应用场景:经典上下布局中,顶部导航条固定,下 ...
- bzoj1433: [ZJOI2009]假期的宿舍(最大二分图匹配)
1433: [ZJOI2009]假期的宿舍 题目:传送门 题解: 这题有点水 跑个二分图匹配就完事了(注意在校生不是一定都互相认识) 代码: #include<cstdio> #inclu ...
- JS实现文字图片无缝滚动
今天做项目遇到一个滚动的效果,本来打算用marquee做的,因为它是html自带的标签,写起来简单,但是有一个问题就是marquee不能实现无缝滚动,上网找了一些方法,发现marquee可以实现无缝, ...
- 设置和获取Android中各种音量
通过程序获取android系统手机的铃声和音量.同样,设置铃声和音量的方法也很简单! AudioManager am = (AudioManager) getSystemService(Context ...
- VS2013+PTVS,python编码问题
1.调试,input('中文'),乱码2.调试,print('中文'),正常3.不调试,input('中文'),正常4.不调试,print('中文'),正常 页面编码方式已经加了"# -- ...
- sql排名函数--四个
1 row_number 2 rank 3 dense_rank 4 ntile 例子如下: select * into #MyTablefrom(select '语文' as 课程,70 as 成绩 ...
- monitoring_db
#!/bin/bash# Program: # Automatic inspection operation system and oracle database.# History:# 2016/0 ...
- UI Framework-1: UI Development Practices
UI Development Practices Guidelines Principles for developing for Chrome. These best practices cente ...
- POJ2976 Dropping tests(01分数规划)
题意 给你n次测试的得分情况b[i]代表第i次测试的总分,a[i]代表实际得分. 你可以取消k次测试,得剩下的测试中的分数为 问分数的最大值为多少. 题解 裸的01规划. 然后ans没有清0坑我半天. ...