并发模型(二)——Master-Worker模式
来源:互联网 发布:女程序员的发展 编辑:程序博客网 时间:2024/06/10 22:06
Master-Worker模式是常用的并行模式之一,它的核心思想是,系统有两个进程协作工作:Master进程,负责接收和分配任务;Worker进程,负责处理子任务。当Worker进程将子任务处理完成后,结果返回给Master进程,由Master进程做归纳汇总,最后得到最终的结果。
一、什么是Master-Worker模式:
该模式的结构图:
结构图:
Worker:用于实际处理一个任务;
Master:任务的分配和最终结果的合成;
Main:启动程序,调度开启Master。
二、代码实现:
下面的是一个简易的Master-Worker框架实现。
(1)Master部分:
package MasterWorker;import java.util.HashMap;import java.util.Map;import java.util.Queue;import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.ConcurrentLinkedQueue;public class Master {//任务队列protected Queue<Object> workQueue= new ConcurrentLinkedQueue<Object>();//Worker进程队列protected Map<String ,Thread> threadMap= new HashMap<String ,Thread>();//子任务处理结果集protected Map<String ,Object> resultMap= new ConcurrentHashMap<String, Object>();//是否所有的子任务都结束了public boolean isComplete(){for(Map.Entry<String , Thread> entry:threadMap.entrySet()){if(entry.getValue().getState()!=Thread.State.TERMINATED){return false;}}return true ;}//Master的构造,需要一个Worker进程逻辑,和需要Worker进程数量public Master(Worker worker,int countWorker){worker.setWorkQueue(workQueue);worker.setResultMap(resultMap);for(int i=0;i<countWorker;i++){threadMap.put(Integer.toString(i), new Thread(worker, Integer.toString(i)));}}//提交一个任务public void submit(Object job){workQueue.add(job);}//返回子任务结果集public Map<String ,Object> getResultMap(){return resultMap;}//开始运行所有的Worker进程,进行处理public void execute(){ for(Map.Entry<String , Thread> entry:threadMap.entrySet()){ entry.getValue().start(); }}}
(2)Worker进程实现:
package MasterWorker;import java.util.Map;import java.util.Queue;public class Worker implements Runnable{//任务队列,用于取得子任务protected Queue<Object> workQueue;//子任务处理结果集protected Map<String ,Object> resultMap;public void setWorkQueue(Queue<Object> workQueue){this.workQueue= workQueue;}public void setResultMap(Map<String ,Object> resultMap){this.resultMap=resultMap;}//子任务处理的逻辑,在子类中实现具体逻辑public Object handle(Object input){return input;}@Overridepublic void run() {while(true){//获取子任务Object input= workQueue.poll();if(input==null){break;}//处理子任务Object re = handle(input);resultMap.put(Integer.toString(input.hashCode()), re);}}}
(3)运用这个小框架计算1——100的立方和,PlusWorker的实现:
package MasterWorker;public class PlusWorker extends Worker {@Overridepublic Object handle(Object input) {Integer i =(Integer)input;return i*i*i;}}
(4)进行计算的Main函数:
package MasterWorker;import java.util.Map;import java.util.Set;public class Main {/** * @param args */public static void main(String[] args) {//固定使用5个Worker,并指定WorkerMaster m = new Master(new PlusWorker(), 5);//提交100个子任务for(int i=0;i<100;i++){m.submit(i);}//开始计算m.execute();int re= 0;//保存最终结算结果Map<String ,Object> resultMap =m.getResultMap();//不需要等待所有Worker都执行完成,即可开始计算最终结果while(resultMap.size()>0 || !m.isComplete()){Set<String> keys = resultMap.keySet();String key =null;for(String k:keys){key=k;break;}Integer i =null;if(key!=null){i=(Integer)resultMap.get(key);}if(i!=null){//最终结果re+=i;}if(key!=null){//移除已经被计算过的项resultMap.remove(key);}}}}
三、总结:
Master-Worker模式是一种将串行任务并行化的方案,被分解的子任务在系统中可以被并行处理,同时,如果有需要,Master进程不需要等待所有子任务都完成计算,就可以根据已有的部分结果集计算最终结果集。
2 0
- 并发模型(二)——Master-Worker模式
- 并发模型(二)——Master-Worker模式
- 并发模型(二)——Master-Worker模式
- 并发模型(二)——Master-Worker模式
- 并发模型(二)——Master-Worker模式
- 并发模型(二)——Master-Worker模式
- 并发模型(二)——Master-Worker模式
- 并发编程实现模型之(二)Master-Worker模式
- 并发模式(二)Master-Worker模式
- java线程深度解析(四)——并发模型(Master-Worker)
- java线程深度解析(四)——并发模型(Master-Worker)
- 从并发模型Master-Worker说起
- 并发模型Master-Worker简单应用
- 并发设计模式之Master-Worker模式
- 并发编程复习(十):master和worker模式
- 多线程——worker-master模式
- Java 并发模式之Master-Worker
- 并发编程之Master-Worker模式
- 动态调用webservice(转)
- android系统开发中个人小问题汇总 (转)
- EditView实现小数点后位数限制功能
- [Android笔记]放缩图片(照片)以及清除
- UISegmentedControl的详细使用
- 并发模型(二)——Master-Worker模式
- 关于 windows和Linux互传文件的问题
- hdu 4487 Maximum Random Walk(概率dp)
- Ubuntu14.04/12.04安装搜狗输入法
- Eclipse启动报错
- android设计模式-观察者模式
- 数据在计算机中的存储方式
- leetcode - Longest Consecutive Sequence
- 解释器模式(Interpreter)