Master-Worker模式是常用的并行设计模式,可以将大任务划分为小任务,是一种分而治之的设计理念。

系统由两个角色组成,Master和Worker,Master负责接收和分配任务,Worker负责处理任务  。子进程处理完成以后,会把结果返回给Master。

原理图如下

下面代码演示

public abstract 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;
} @Override
public void run() {
while (true) {
Object object = workQueue.poll(); //因为当空的时候 会返回空
if(object==null){
break;
}
Object rtn = handle(object);
resultMap.put(rtn.hashCode() + "", rtn);
} }
//具体的执行逻辑 交给子类
public abstract Object handle(Object input) ; }

  

public class PlusWorker extends Worker {
@Override
public Object handle(Object input) {
Integer i =(Integer)input;
return i;
}
}

  

public class Master {

	// 存放提交的任务
Queue<Object> planQueue = new ConcurrentLinkedQueue<>();
// 处理任务的线程
Map<String, Thread> threads = new HashMap<String, Thread>();
// 存储每个任务的完成结果
private Map<String, Object> result = new ConcurrentHashMap<String, Object>(); public Master(Worker w, int workerNum) {
if (workerNum <= 0) {
throw new RuntimeException("workerNum 不能《=0");
}
w.setResultMap(result);
w.setWorkQueue(planQueue);
for (int i = 0; i < workerNum; i++) {
threads.put(i + "", new Thread(w, i + ""));
}
} // 添加任务的方法
public void submit(Object obj) {
planQueue.add(obj);
} public void execute() { for (Map.Entry<String, Thread> entry : threads.entrySet()) {
entry.getValue().start();
}
} public Map<String, Object> getResMap() {
return result;
} // 判断所有工作线程是否执行完毕
public boolean isComplete() {
for (Map.Entry<String, Thread> entry : threads.entrySet()) {
if (entry.getValue().getState() != Thread.State.TERMINATED) {
return false;
}
}
return true;
} // 返回结果集
public Object getRes() {
Integer re = 0;
Map<String, Object> resultMap = result;
for (String string : resultMap.keySet()) {
Integer ob = (Integer) resultMap.get(string);
re = ob + re;
}
return re;
}
}

  测试类

public class Main {
public static void main(String[] args) {
// long now = System.currentTimeMillis();
Master master = new Master(new PlusWorker(), 1);
for (int i = 1; i <= 1000; i++) {
master.submit(i);
} master.execute();
//保存最终结算结果
while(true)
{
if(master.isComplete()){
System.out.println(master.getRes());
break;
} } }
}

  

注意::::重量级的工作配合多核cpu效果不错,轻量级的程序单线程工作效果不一定比并发的差.

java多线程系列14 设计模式 Master-Worker的更多相关文章

  1. java多线程系列15 设计模式 生产者 - 消费者模式

    生产者-消费者 生产者消费者模式是一个非常经典的多线程模式,比如我们用到的Mq就是其中一种具体实现 在该模式中 通常会有2类线程,消费者线程和生产者线程 生产者提交用户请求 消费者负责处理生产者提交的 ...

  2. java多线程系列13 设计模式 Future 模式

    Future 模式 类似于ajax请求  页面异步的进行后台请求 用户无需等待请求的结果 就可以继续浏览或者操作 核心就是:去除了主函数的等待时间,并使得原本需要等待的时间段可以用于处理其他业务逻辑 ...

  3. java多线程系列 目录

    Java多线程系列1 线程创建以及状态切换    Java多线程系列2 线程常见方法介绍    Java多线程系列3 synchronized 关键词    Java多线程系列4 线程交互(wait和 ...

  4. Java多线程系列--“JUC线程池”03之 线程池原理(二)

    概要 在前面一章"Java多线程系列--“JUC线程池”02之 线程池原理(一)"中介绍了线程池的数据结构,本章会通过分析线程池的源码,对线程池进行说明.内容包括:线程池示例参考代 ...

  5. Java多线程系列--“JUC锁”10之 CyclicBarrier原理和示例

    概要 本章介绍JUC包中的CyclicBarrier锁.内容包括:CyclicBarrier简介CyclicBarrier数据结构CyclicBarrier源码分析(基于JDK1.7.0_40)Cyc ...

  6. Java多线程系列目录(共43篇)

    最近,在研究Java多线程的内容目录,将其内容逐步整理并发布. (一) 基础篇 01. Java多线程系列--“基础篇”01之 基本概念 02. Java多线程系列--“基础篇”02之 常用的实现多线 ...

  7. Java多线程系列--“JUC锁”09之 CountDownLatch原理和示例

    概要 前面对"独占锁"和"共享锁"有了个大致的了解:本章,我们对CountDownLatch进行学习.和ReadWriteLock.ReadLock一样,Cou ...

  8. Java多线程系列--“JUC集合”04之 ConcurrentHashMap

    概要 本章是JUC系列的ConcurrentHashMap篇.内容包括:ConcurrentHashMap介绍ConcurrentHashMap原理和数据结构ConcurrentHashMap函数列表 ...

  9. Java多线程系列--“JUC集合”05之 ConcurrentSkipListMap

    概要 本章对Java.util.concurrent包中的ConcurrentSkipListMap类进行详细的介绍.内容包括:ConcurrentSkipListMap介绍ConcurrentSki ...

随机推荐

  1. mysql ibdata1

    ibdata1是什么? Mysql ibdata1即Innodb data1缩写,是innodb引擎的表空间,用于存放 数据字典Data dictionary:  只读的表,存储对象的相关信息,如占用 ...

  2. 【算法和数据结构】_15_小算法_打印EOF的值

    /* 本程序打印EOF的值 */ #include <stdio.h> int main(int argc,char* argv[],char* env) { printf("E ...

  3. lecune入门示例

    注意:本示例中的lucene版本需在jdk7以上使用. 一.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" ...

  4. Kettle在windows下分布式集群的搭建

    集群的搭建 我这里用的是kettle7.1版本的 下载解压 我们打开kettle的安装目录,进入到data-integration->pwd目录,找到carte-config-master-80 ...

  5. 杂谈1.py

    Python命名规则: 1. 组成:数字/字母/下划线 只能以字母,下划线开头 不能包含空格 避免Python关键字和函数名 简短且具有描述性 描述数据形态及支持操作 Python动态类型 变量无类型 ...

  6. Centos6搭建Samba服务并使用Windows挂载

    一.安装相关软件 [root@mail ~]# yum install samba samba-client -y #安装相关软件 二.配置匿名访问 [root@mail ~]# cd /etc/sa ...

  7. OpenStack Mitaka/Newton/Ocata/Pike 各版本功能贴整理

    逝者如斯,刚接触OpenStack的时候还只是第9版本IceHouse.前几天也看到了刘大咖更新了博客,翻译了Mirantis博客文章<OpenStack Pike 版本中的 53 个新功能盘点 ...

  8. Oracle导出表数据与导入表数据dmp,以及导入导出时候常见错误

    使用DOS 操作界面导出表数据,导入表数据(需要在数据库所在的服务器上边执行) exp UserName/Password@192.168.0.141/orcl   file=d:\xtables.d ...

  9. 三台linux集群hadoop,在此上面运行hive

    ---恢复内容开始--- 一,准备 先有三台linux,对hadoop集群的搭建. eddy01:开启一个hdfs的老大namenode,yarn的老大ResourceManager其中进程包括(No ...

  10. !!!常用CSS代码块

    图片排满一行.左右两端无间隙. <style type="text/css"> .img_abc{float:left;width:30%;margin-left:5% ...