一. 介绍

需要使用Master-Worker的场景:主线程开了多个子进程(Worker进程)去执行任务时,主线程希望能收集到每个子进程的执行结果。

所以,Master-Worker模式基本上就是:

1.在Master进程中,定义好需要执行的任务集和需要收集的结果集

2.每一个子进程(Worker进程)从任务集中取一个任务执行,将执行结果写入结果集

3.Master根据结果集的内容做相应的处理

模式结构如下图所示:

二. 基本代码实现

Master 进程:

  1. class Master{
  2. private Queue<Integer> workerQueue = new ConcurrentLinkedQueue<Integer>();
  3. private Map<String, Object> resultMap = new HashMap<String,Object>();
  4. private List<Thread> threadList = new ArrayList<Thread>();
  5. public Master(Worker worker){
  6. worker.setWorkerQueue(workerQueue);
  7. worker.setResultMap(resultMap);
  8. for(int i=0; i<5; i++){ //比如,开5个子进程
  9. threadList.add(new Thread(worker));
  10. }
  11. }
  12. public Map<String, Object> getResultMap(){
  13. return resultMap;
  14. }
  15. public void execute(){
  16. for(Thread thread: threadList){
  17. thread.start();
  18. }
  19. }
  20. //判断所有子进程是否结束了
  21. public Boolean isCompleted(){
  22. for(Thread thread: threadList){
  23. if(thread.getState() != Thread.State.TERMINATED){
  24. return false;
  25. }
  26. }
  27. return true;
  28. }
  29. }

Worker 进程

  1. class Worker implements Runnable{
  2. private Queue<Integer> workerQueue;
  3. private Map<String, Object> resultMap;
  4. public void setResultMap(Map map){
  5. this.resultMap = map;
  6. }
  7. public Map<String, Object> getResultMap(){
  8. return resultMap;
  9. }
  10. public void setWorkerQueue(Queue workerQueue){
  11. this.workerQueue = workerQueue;
  12. }
  13. public void handle(Object task){
  14. // TODO
  15. /**
  16. * 此处就是任务处理程序
  17. * */
  18. }
  19. @Override
  20. public void run() {
  21. // TODO
  22. Object task = workerQueue.poll();
  23. if(task != null){
  24. handle(task);
  25. }
  26. }
  27. }

主函数:

  1. Worker worker = new Worker();
  2. Master master = new Master(worker);
  3. master.execute();
  4. while(!master.isCompleted){
  5. //TODO
  6. //此处可以对master.resultMap进行获取处理,不一定要等所有任务执行完毕
  7. }

从Worker代码中可以看到,Master是将任务集和结果集通过Setter注入到Worker中,任务集用队列存储,是线程安全的。具体的处理就写在Worker的handle方法中

多线程模式之Master-Worker的更多相关文章

  1. 多线程模式之MasterWorker模式

    多线程模式之MasterWorker模式 Master-Worker模式的核心思想是,系统由两类进程协作工作:Master进程和Worker进程.Master进程负责接收和分配任务,Worker进程负 ...

  2. Apache-三种工作模式(prefork/ worker/Event)

    Apache-两种工作模式(prefork/ worker/Event) Apache 2.X  支持插入式并行处理模块,称为多进程处理模块(MPM).在编译apache时必须选择也只能选择一个MPM ...

  3. winform 承载 WCF 注意,可能不是工作在多线程模式下

    [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMo ...

  4. Servlet单实例多线程模式

    http://kakajw.iteye.com/blog/920839 前言:Servlet/JSP技术和ASP.PHP等相比,由于其多线程运行而具有很高的执行效率.由于Servlet/JSP默认是以 ...

  5. Netty-主从Reactor多线程模式的源码实现

    Netty--主从Reactor多线程模式的源码实现 总览 EventLoopGroup到底是什么? EventLoopGroup是一个存储EventLoop的容器,同时他应该具备线程池的功能. gr ...

  6. MySQL MGR 单主模式下master角色切换规则

    MGR单主模式,master节点可读可写,其余节点都是只读.当配置MGR为单主模式,非master节点自动开启super_read_only 当可读可写的节点异常宕机,会进行怎样的切换?在选择新的可写 ...

  7. 多线程模式下高并发的环境中唯一确保单例模式---DLC双端锁

    DLC双端锁,CAS,ABA问题 一.什么是DLC双端锁?有什么用处? 为了解决在多线程模式下,高并发的环境中,唯一确保单例模式只能生成一个实例 多线程环境中,单例模式会因为指令重排和线程竞争的原因会 ...

  8. HTML5之worker开启JS多线程模式及window.postMessage跨域

    worker概述 worker基本使用 window下的postMessage worker多线程的应用 一.worker概述 web worker实际上是开启js异步执行的一种方式.在html5之前 ...

  9. Apache常用2种工作模式prefork和worker比较

    Apache两种常用工作模式:prefork和worker. prefork MPM prefork是一个非线程型的.预派生的MPM,使用多个进程,每个进程在某个确定的时间只单独处理一个连接,效率高, ...

随机推荐

  1. oracle新手随记10

    1. unpivot注意点:select new_col from (select ename,job,to_char(sal) as sal,null as c from emp)         ...

  2. powershell无法拖动文件到命令行

    PS C:\Program Files\PowerShell\6.0.0-beta.6> New-Service -Name LISA_43_Dev_Batch -DisplayName LIS ...

  3. flatMap作用

    总结:1. map会将每一条输入映射为一个新对象.{苹果,梨子}.map(去皮) = {去皮苹果,去皮梨子} 其中: “去皮”函数的类型为:A => B 2.flatMap包含两个操作:会将每一 ...

  4. MongoDB,SpringBoot,SpringDataMongoDB

    MongoDB,SpringBoot,SpringDataMongoDB 双刃剑MongoDB的学习和避坑 MongoDB 是一把双刃剑,它对数据结构的要求并不高.数据通过key-value的形式存储 ...

  5. Dictionaries

    A dictionary is like a list, but more general. In a list, the indices have to be integers; in a dict ...

  6. spring boot整合mail

    1.添加依赖 </dependency> <dependency> <groupId>org.springframework.boot</groupId> ...

  7. Spring MVC模式示例(未采用解耦控制器)

    Product package com.mstf.bean; import java.io.Serializable; /** * Product类,封装了一些信息,包含三个属性 * @author ...

  8. kotlin MutableList sort

    fun MutableList<Int>.swap(index1: Int, index2: Int) {val tmp = this[index1] // 'this' correspo ...

  9. nil gogo

    https://blog.csdn.net/zhonggaorong/article/details/50233421 https://github.com/KevinHM/FunctionalRea ...

  10. python(1)处理图像

    一提到数字图像处理,可能大多数人就会想到matlab,但matlab也有自身的缺点: 1.不开源,价格贵 2.软件容量大.一般3G以上,高版本甚至达5G以上. 3.只能做研究,不易转化成软件. 因此, ...