Master-Worker模式是常用的并行模式之一,它的核心思想是,系统有两个进程协作工作:Master进程,负责接收和分配任务;Worker进程,负责处理子任务。当Worker进程将子任务处理完成后,结果返回给Master进程,由Master进程做归纳汇总,最后得到最终的结果。

一、什么是Master-Worker模式:

该模式的结构图:

结构图:

Worker:用于实际处理一个任务;

Master:任务的分配和最终结果的合成;

Main:启动程序,调度开启Master。

二、代码实现:

下面的是一个简易的Master-Worker框架实现。

(1)Master部分:

  1. package MasterWorker;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import java.util.Queue;
  5. import java.util.concurrent.ConcurrentHashMap;
  6. import java.util.concurrent.ConcurrentLinkedQueue;
  7. public class Master {
  8. //任务队列
  9. protected Queue<Object> workQueue= new ConcurrentLinkedQueue<Object>();
  10. //Worker进程队列
  11. protected Map<String ,Thread> threadMap= new HashMap<String ,Thread>();
  12. //子任务处理结果集
  13. protected Map<String ,Object> resultMap= new ConcurrentHashMap<String, Object>();
  14. //是否所有的子任务都结束了
  15. public boolean isComplete(){
  16. for(Map.Entry<String , Thread> entry:threadMap.entrySet()){
  17. if(entry.getValue().getState()!=Thread.State.TERMINATED){
  18. return false;
  19. }
  20. }
  21. return true ;
  22. }
  23. //Master的构造,需要一个Worker进程逻辑,和需要Worker进程数量
  24. public Master(Worker worker,int countWorker){
  25. worker.setWorkQueue(workQueue);
  26. worker.setResultMap(resultMap);
  27. for(int i=0;i<countWorker;i++){
  28. threadMap.put(Integer.toString(i),  new Thread(worker, Integer.toString(i)));
  29. }
  30. }
  31. //提交一个任务
  32. public void submit(Object job){
  33. workQueue.add(job);
  34. }
  35. //返回子任务结果集
  36. public Map<String ,Object> getResultMap(){
  37. return resultMap;
  38. }
  39. //开始运行所有的Worker进程,进行处理
  40. public  void execute(){
  41. for(Map.Entry<String , Thread> entry:threadMap.entrySet()){
  42. entry.getValue().start();
  43. }
  44. }
  45. }

(2)Worker进程实现:

  1. package MasterWorker;
  2. import java.util.Map;
  3. import java.util.Queue;
  4. public class Worker  implements Runnable{
  5. //任务队列,用于取得子任务
  6. protected Queue<Object> workQueue;
  7. //子任务处理结果集
  8. protected Map<String ,Object> resultMap;
  9. public void setWorkQueue(Queue<Object> workQueue){
  10. this.workQueue= workQueue;
  11. }
  12. public void setResultMap(Map<String ,Object> resultMap){
  13. this.resultMap=resultMap;
  14. }
  15. //子任务处理的逻辑,在子类中实现具体逻辑
  16. public Object handle(Object input){
  17. return input;
  18. }
  19. @Override
  20. public void run() {
  21. while(true){
  22. //获取子任务
  23. Object input= workQueue.poll();
  24. if(input==null){
  25. break;
  26. }
  27. //处理子任务
  28. Object re = handle(input);
  29. resultMap.put(Integer.toString(input.hashCode()), re);
  30. }
  31. }
  32. }

(3)运用这个小框架计算1——100的立方和,PlusWorker的实现:

  1. package MasterWorker;
  2. public class PlusWorker extends Worker {
  3. @Override
  4. public Object handle(Object input) {
  5. Integer i =(Integer)input;
  6. return i*i*i;
  7. }
  8. }

(4)进行计算的Main函数:

  1. package MasterWorker;
  2. import java.util.Map;
  3. import java.util.Set;
  4. public class Main {
  5. /**
  6. * @param args
  7. */
  8. public static void main(String[] args) {
  9. //固定使用5个Worker,并指定Worker
  10. Master m = new Master(new PlusWorker(), 5);
  11. //提交100个子任务
  12. for(int i=0;i<100;i++){
  13. m.submit(i);
  14. }
  15. //开始计算
  16. m.execute();
  17. int re= 0;
  18. //保存最终结算结果
  19. Map<String ,Object> resultMap =m.getResultMap();
  20. //不需要等待所有Worker都执行完成,即可开始计算最终结果
  21. while(resultMap.size()>0 || !m.isComplete()){
  22. Set<String> keys = resultMap.keySet();
  23. String key =null;
  24. for(String k:keys){
  25. key=k;
  26. break;
  27. }
  28. Integer i =null;
  29. if(key!=null){
  30. i=(Integer)resultMap.get(key);
  31. }
  32. if(i!=null){
  33. //最终结果
  34. re+=i;
  35. }
  36. if(key!=null){
  37. //移除已经被计算过的项
  38. resultMap.remove(key);
  39. }
  40. }
  41. }
  42. }

三、总结:

Master-Worker模式是一种将串行任务并行化的方案,被分解的子任务在系统中可以被并行处理,同时,如果有需要,Master进程不需要等待所有子任务都完成计算,就可以根据已有的部分结果集计算最终结果集。

转:http://blog.csdn.net/lmdcszh/article/details/39698189

多线程设计模式(三):Master-Worker模式的更多相关文章

  1. Java多线程设计模式(4)线程池模式

    前序: Thread-Per-Message Pattern,是一种对于每个命令或请求,都分配一个线程,由这个线程执行工作.它将“委托消息的一端”和“执行消息的一端”用两个不同的线程来实现.该线程模式 ...

  2. java设计模式三种工厂模式简单介绍

    一.简单工厂模式 概述:简单工厂模式的创建意图就是,把对类的创建初始化全都交给一个工厂来执行,而用户不需要去关心创建的过程是什么样的,只用告诉工厂我想要什么就行了.而这种方法的缺点也很明显,违背了设计 ...

  3. java设计模式---三种工厂模式

    工厂模式提供创建对象的接口. 工厂模式分为三类:简单工厂模式(Simple Factory), 工厂方法模式(Factory Method)和抽象工厂模式(Abstract Factory).GOF在 ...

  4. java设计模式---三种工厂模式之间的区别

    简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式.其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性. 本文是本人对这三种模式学习后的一个小结以及对他 ...

  5. Java经典23结构模型的设计模式(三)------附加代理模式、适配器型号、Facade模式的差异

    本文介绍了7样的结构模型中的其余2种:轻量级.代理模式. 一.享元模式FlyWeight 享元模式比較简单且重要,在非常多场合都被用到.仅仅只是封装起来了用户看不到.其概念:运用共享内存技术最大限度的 ...

  6. java23种设计模式——三、工厂模式

    源码在我的github和gitee中获取 工厂模式 工厂模式介绍 工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式.著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在J ...

  7. java设计模式(三)--抽象工厂模式

    转载:http://zz563143188.iteye.com/blog/1847029 前面的工厂方法模式虽然清晰,但还是感觉有些繁琐,通常使用的还是抽象工厂模式. 工厂方法模式有一个问题就是,类的 ...

  8. JAVA中的设计模式三(策略模式)

    问题: 如何让算法和对象分开来,使得算法可以独立于使用它的客户而变化?   方案: 把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口,然后在类中包含这个对象的实例,这样类的实例在运行时就 ...

  9. java常用设计模式三:原型模式

    在说原型模式之前先说一下浅拷贝和深拷贝的概念 一.浅拷贝和深拷贝 1.浅拷贝 在java中,对象创建后需要有一个引用变量来指向该对象实际的地址空间,也就是说引用变量与对象实体是两个不同的数据体.在Ob ...

  10. 设计模式—三种工厂模式(JAVA)

    一:简单工厂: 有一个实际工厂,这个工厂只能造一类的产品,这一类产品就是一个产品接口,会有多个具体产品实现这个接口,例 如,一个手机厂,生产苹果手机,三星手机: 缺点:在工厂类中集中了所有实例的创建逻 ...

随机推荐

  1. PHP的可变变量名

    有时候可变的变量名会给编程带来很大的方便.也就是说变量名可以被动态的命名和使用.通常变量通过下面这样的语句来命名 : 1 2 3 <!--?php $a = 'hello'; ?--> 可 ...

  2. selenium学习笔记(xpath和css定位)

    简单的介绍下xpath和css的定位 理论知识就不罗列了 还是利用博客园的首页.直接附上代码: 这个是xpath #!/usr/bin/env python # -*- coding: utf_8 - ...

  3. 不合法的请求字符,不能包含\uxxxx格式的字符

    不合法的请求字符,不能包含\uxxxx格式的字符 ,不支持数组转json_encode()格式, 需要直接将数组,拼合成 json格式 ** * 微信api不支持中文转义的json结构 * @para ...

  4. 如何用VC编写供PB调用的DLL

    和编写一般的DLL方法相同,需要注意以下两点: (1)调用约定 c函数有_stdcall._cdecl._fastcall等多种调用约定,调用约定用来说明函数参数的压栈顺序和由谁(函数自身还是调用者) ...

  5. oracle数据库查看用户相关语句

    1.查看所有用户:   select * from dba_users;   select * from all_users;   select * from user_users;   2.查看用户 ...

  6. 32-THREE.JS 球体

    <!DOCTYPE html> <html> <head> <title>Example 05.05 - Basic 3D geometries - S ...

  7. 20165210 2017-2018-2《Java程序设计》课程总结

    20165210 2017-2018-2<Java程序设计>课程总结 每周作业链接汇总: 预备作业一: 20165210 我期望的师生关系 预备作业二:20165210 学习基础和C语言基 ...

  8. Ubuntu下搭建WordPress环境

    WordPress是一种使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站.也可以把 WordPress当作一个内容管理系统(CMS)来使用.WordPr ...

  9. WWDC 2017, 让我们看看 iTunesConnect 有了哪些不同

    距离 WWDC 2017 过去已经有 7 天了,小伙伴们是不是已经发现我们的苹果后台和之前的界面有些略微的不同,如果有心的朋友下了 iOS 11 beta 版就会发现设备上的 App Store 界面 ...

  10. mysql基本操作(重点)

    显示数据库 show databases 进入指定数据库 use 数据库名称 创建数据库 create database 数据库名称 default character set=utf8 删除数据库 ...