多线程:多线程设计模式(三):Master-Worker模式
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;
- }
- @Override
- public 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 {
- @Override
- public 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,并指定Worker
- Master 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进程不需要等待所有子任务都完成计算,就可以根据已有的部分结果集计算最终结果集。
转:http://blog.csdn.net/lmdcszh/article/details/39698189
多线程:多线程设计模式(三):Master-Worker模式的更多相关文章
- java设计模式三种工厂模式简单介绍
一.简单工厂模式 概述:简单工厂模式的创建意图就是,把对类的创建初始化全都交给一个工厂来执行,而用户不需要去关心创建的过程是什么样的,只用告诉工厂我想要什么就行了.而这种方法的缺点也很明显,违背了设计 ...
- java设计模式---三种工厂模式
工厂模式提供创建对象的接口. 工厂模式分为三类:简单工厂模式(Simple Factory), 工厂方法模式(Factory Method)和抽象工厂模式(Abstract Factory).GOF在 ...
- java设计模式---三种工厂模式之间的区别
简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式.其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性. 本文是本人对这三种模式学习后的一个小结以及对他 ...
- Java经典23结构模型的设计模式(三)------附加代理模式、适配器型号、Facade模式的差异
本文介绍了7样的结构模型中的其余2种:轻量级.代理模式. 一.享元模式FlyWeight 享元模式比較简单且重要,在非常多场合都被用到.仅仅只是封装起来了用户看不到.其概念:运用共享内存技术最大限度的 ...
- java23种设计模式——三、工厂模式
源码在我的github和gitee中获取 工厂模式 工厂模式介绍 工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式.著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在J ...
- java设计模式(三)--抽象工厂模式
转载:http://zz563143188.iteye.com/blog/1847029 前面的工厂方法模式虽然清晰,但还是感觉有些繁琐,通常使用的还是抽象工厂模式. 工厂方法模式有一个问题就是,类的 ...
- JAVA中的设计模式三(策略模式)
问题: 如何让算法和对象分开来,使得算法可以独立于使用它的客户而变化? 方案: 把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口,然后在类中包含这个对象的实例,这样类的实例在运行时就 ...
- java常用设计模式三:原型模式
在说原型模式之前先说一下浅拷贝和深拷贝的概念 一.浅拷贝和深拷贝 1.浅拷贝 在java中,对象创建后需要有一个引用变量来指向该对象实际的地址空间,也就是说引用变量与对象实体是两个不同的数据体.在Ob ...
- 设计模式—三种工厂模式(JAVA)
一:简单工厂: 有一个实际工厂,这个工厂只能造一类的产品,这一类产品就是一个产品接口,会有多个具体产品实现这个接口,例 如,一个手机厂,生产苹果手机,三星手机: 缺点:在工厂类中集中了所有实例的创建逻 ...
- java23种设计模式——四、原型模式
源码在我的github和gitee中获取 目录 java23种设计模式-- 一.设计模式介绍 java23种设计模式-- 二.单例模式 java23种设计模式--三.工厂模式 java23种设计模式- ...
随机推荐
- Android开发获取多个存储空间的路径(内置SD卡以及外置SD卡)
Android开发中经常会遇到多存储空间的问题,包括内置存储路径以及外置SD卡,而且有的时候会有多张外置SD卡,此时就需要获取不同的SD卡路径,然后根据需要来写入或者读出文件. 此处给出常用的SD卡工 ...
- Nginx反向代理和负载均衡的配置
1.反向代理配置 反向代理也称"动静分离",nginx不自己处理图片的相关请求,而是把图片的请求转发给其他服务器来处理. 修改nginx部署目录下conf子目录的nginx.con ...
- destoon源码分析一
#0x01 先记录一些之前模糊的小知识点,补充一下 set_magic_quotes_runtime() -- 设置magic_quotes_runtime配置激活状态(php 5.3 被弃用,php ...
- 一起来学Go --- (go的简介以及环境的安装)
Go 相信大家,看到这篇文章的时候,已经自己在百度百科了解了go的发展史已经特性,再次我依然....得哔哔叨一会. ^.^ go语言的特性 go语言作为一门静态类型开发语言,与当前的开发语言想必具 ...
- 为shell布置陷阱:trap捕捉信号方法论
本文目录: 1.1 信号说明 1.2 trap布置陷阱 1.3 布置完美陷阱必备知识 家里有老鼠,快消灭它!哎,又给跑了.老鼠这小东西跑那么快,想直接直接消灭它还真不那么容易.于是,老鼠药.老鼠夹子或 ...
- 第二章 R语言数据结构
R语言存储数据的结构包括:标量.向量.矩阵.数组.数据框和列表:可以处理的数据类型包括:数值型.字符型.逻辑型.复数型和原生型. 数据结构 向量 向量是用来存储数值型.字符型或逻辑型数据的一维数组.单 ...
- string,char*,int 之间的转化
c++中经常遇到string,char*,int之间的相互转化,今天就来整理一下. 以下是转载并修改的内容: 以下是常用的几种类型互相之间的转换 string 转 int先转换为char*,再使用at ...
- 处理 Vue 单页面应用 SEO 的另一种思路
vue-meta-info 官方地址: monkeyWangs/vue-meta-info (设置vue 单页面meta info信息,如果需要单页面SEO,可以和 prerender-spa-plu ...
- JavaScript面向对象(二)——成员属性、静态属性、原型属性与JS原型链
前 言 JRedu 上一篇博客中,我们介绍了JS中的面向对象,并详细的解释了this的指向问题.本篇博客,我们继续来学习JS的面向对象.来深入理解一下JavaScript OOP中的成员属性/方 ...
- java 运行时常量、编译时常量、静态块执行顺序
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt223 常量是程序运行时恒定不变的量,许多程序设计语言都有某种方法,向编译器告 ...