java中的并行模式之Master-Worker模式
来源:互联网 发布:linux 目录授权 编辑:程序博客网 时间:2024/05/29 13:08
这个类主要介绍程序开发过程中的Master—Worker模式
该模式是常用的并行模式之一。
核心思想是:系统由两类进程协作:Master进程和Worker进程。
Master进程负责接收和分配任务,Worker负责处理子任务。当各个worker进程将子任务处理完成后,将结果返回
给Master,由Master进程做归纳和汇总, 从而得到系统的复杂结果。
优点是:它能够将一个大任务分解成若干个小任务,可以并行执行,提高系统的吞吐率。
现在附Master-Worker代码如下(主要包括四个类Master,Worker,PlusWorker,Main),其中Master和Worker类给出了Master-Worker模式的框架,而PlusWorke则是继承Worker类,重写handle方法,实现子任务具体在实际过程中做的工作,Main类则是包含启动Master-Worker模式的方法。
public class Master{ //主进程Master类/**任务队列<br>*/protected Queue<Object> workQueue = new ConcurrentLinkedQueue<Object>();/**进程队列<br>*/protected Map<String,Thread> threadMap = new HashMap<String,Thread>();/**子任务处理结果集<br>*/protected Map<String,Object> resultMap = new ConcurrentHashMap<String,Object>();/**@author zk * @see 判断是否所有的子任务都结束了 * @return 如果所有的任务都完成可则返回true,否则返回false */public boolean isComplete(){ //for (Thread thread : threadMap.values()) { // if(thread.getState() != Thread.State.TERMINATED){// return false;// }//} //for(Map.Entry<String, Thread> entry : threadMap.entrySet()){if(entry.getValue().getState()!=Thread.State.TERMINATED){//如果有一个任务的状态不是终止,则说明没有完成所有的任务return false;}}return true;}/**@author zk * 主进程Master的构造函数 * @param Worker 子任务 * @param countWorker 子任务的个数 */public Master(Worker worker,int countWorker){worker.setResultMap(resultMap);worker.setWorkQueue(workQueue);for(int i=0;i<countWorker;i++){threadMap.put(Integer.toString(i), new Thread(worker,Integer.toString(i)));}}/**@author zk * 提交一个任务 * @param job */public void submit(Object job){workQueue.add(job);//相当于是往workQueue工作队列中加上一个任务}/**@author zk * 返回子任务结果集 * @return */public Map<String, Object> getResultMap() {return resultMap;}/**@author zk * 开始运行所有的Worker进程,进行处理 * 也就是说,调用这个execute()方法相当于主进程把任务都分给了子进程去处理 */public void execute(){for(Map.Entry<String, Thread> entry : threadMap.entrySet()){entry.getValue().start();}}}
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;}/**@author zk * 子任务处理逻辑,在子类中实现具体逻辑 * @param input * @return */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中*/resultMap.put(Integer.toString(input.hashCode()), re);}}}
public class PlusWorker extends Worker{public Object handle(Object input){Integer i = (Integer) input;return i*i*i;}}
public class Main {public static void main(String args[]) throws InterruptedException{Long start = System.currentTimeMillis();Master m = new Master(new PlusWorker(),5);for(int i=1;i<=100;i++){//提交100个子任务m.submit(i);}m.execute();//开始计算int re = 0;Map<String,Object> resultMap = m.getResultMap();while(resultMap.size()>0 || !m.isComplete()){ //不必等所有的子任务运行完就可以开始合并resultMap的结果Set<String> keys = resultMap.keySet();String key = null;for(String k:keys){key = k;break;}Integer i = null;if(key != null){//取出key对应的结果i = (Integer) resultMap.get(key);}if(i != null){re += i;}if(key!=null){resultMap.remove(key);//移除已经被计算过得项}}System.out.println("re = "+re);Long end = System.currentTimeMillis();System.out.println("总花费时间 = "+(end-start)+"ms");}}
0 0
- java中的并行模式之Master-Worker模式
- 并行-Master-Worker模式
- 并行设计模式-Master/Worker
- 并行设计模式-Master/Worker
- Master worker并行设计模式
- Java 并行程序设计模式 (Master-Worker模式)
- Java Master-Worker模式
- 并行程序设计模式--Master-Worker模式
- 并行程序设计模式-master-worker模式
- java 想成中的Master-Worker模式
- Java 并发模式之Master-Worker
- java 多线程 master worker模式
- 架构之路--多线程下的设计模式 Master worker并行计算模式
- Java程序性能优化 读书笔记(十一)并行设计模式:Master-Worker模式
- Master-Worker模式,并行设计模式,分配,执行
- 多线程模式之Master-Worker模式
- 并发设计模式之Master-Worker模式
- Java中的线程(五)- Master-Worker模式
- 用友T6客户端 点击系统管理admin.exe,一直无响应
- LeetCode Same Tree OJ 算法 刷题
- Java中length(),length,size()的用法和区别
- 黑马程序员----正则表达式
- 窗体
- java中的并行模式之Master-Worker模式
- 1-Introduction
- 阿里巴巴宣布加入Linux基金会
- 用友T6 操作发票凭证时 portal.exe发生未处理的win32异常,弹出vistual studio实时调试器
- 摄影网站
- 2-Linear Regression with One Variable
- 《JavaScript DOM 编程艺术》读书心得
- 实时搜索引擎Elasticsearch(1)——基础概念、安装和运行
- iOS 手势识别 旋转和缩放(捏合)