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. <ROS> 通讯方式之 Action

    Ros 官网介绍 http://wiki.ros.org/actionlib 一个简易的action教程,package -- example_action_server. action文件夹内存放 ...

  2. excel 设置的函数在打开的时候不会自动执行

    excel中设置了个today的函数,显示今天的日期,结果不执行. 解决方案:打开该excel,选择File-->Options  ,在弹出的框框中选择Formulas,在主界面的Calcula ...

  3. 解决Ubuntn安装中文语言包却不能切换

    记一次奇葩的经历吧,第一次在VM中安装Ubuntn16.04安装完成后的确出现了语言包安装提示,就这样毫无压力的一直用着中文版的Ubuntn. 习惯了一段时间后第二次安装一样的安装方式却始终是英文界面 ...

  4. python之路——9

    王二学习python的笔记以及记录,如有雷同,那也没事,欢迎交流,wx:wyb199594 学习内容 1.文件处理 1.打开文件 open(‘路径’,‘打开方式’) 打开方式 r w a r+ w+ ...

  5. 20165312 2017-2018-2《Java程序设计》课程总结

    20165312 2017-2018-2<Java程序设计>课程总结 每周作业链接汇总 预备作业1:我期望的师生关系 预备作业2:C语言基础调查和java学习展望 预备作业3:Linux安 ...

  6. pt-table-checksum校验与pt-table-sync修复数据

    1:下载工具包 登录网站下载相应的工具包 https://www.percona.com/downloads/percona-toolkit/LATEST/ 2:安装 (1)yum安装: sudo y ...

  7. Vue 折叠面板Collapse在标题上添加组件后,阻止面板冒泡的用法

    iView组件中,折叠面板Collapse点击面板标题部分,会出现面板收起或展开的效果.那么在面板标题后面再添加下拉框之类的组件时,会出现跟面板点击一样的效果,这时候就需要阻止冒泡的用法了.具体代码: ...

  8. SpringMVC之DispatcherServlet类图

    DispatcherServlet类图 在IntelliJ IDEA 中打开其源码,然后右键查看Diagrams,工具会自动生成其类图. 可是直观的看出,DispatcherServlet本质上是Se ...

  9. C#与Excel的交互示例

    //这里加添加一个Excel对象的包装器.就是添加一个引用 using System; using System.Drawing; using System.Collections; using Sy ...

  10. python 爬虫启航2.0

    文章解析: 1.正则表达式解析 2.beautifulsoup,BeautifulSoup是一个复杂的树形结构,她的每一个节点都是一个python对象,获取网页的内容就是一个提取对象内容的过程,它的提 ...