多线程模式之MasterWorker模式

Master-Worker模式的核心思想是,系统由两类进程协作工作:Master进程和Worker进程。Master进程负责接收和分配任务,Worker进程负责处理子任务。当Worker进程将各个子任务处理完成后,将结果返回给Master进程,由Master进程做归纳和汇总。

工作示意图如下图所示:









它的优势在于将一个大的任务分解成一个个的子任务并行执行,提高程序执行效率。

代码示例:



Master进程类:

public class Master {

    protected Queue<Object> workQueue = new ConcurrentLinkedQueue<Object>();//存放子任务

    protected Map<String,Thread> threadMap = new HashMap<String,Thread>();//存放Worker线程

    protected Map<String,Object> resultMap = new ConcurrentHashMap<String, Object>();//存放返回结果集

    public boolean isCompleted(){

        for(Map.Entry<String,Thread> entry:threadMap.entrySet()){

            if(entry.getValue().getState() != Thread.State.TERMINATED){

                return false;

            }

        }

        return true;

    }

    public Master(Worker worker,int countWorker){

        worker.setWorkQueue(workQueue);

        worker.setResultMap(resultMap);

        for(int i=0;i<countWorker;i++){//创建多个Worker线程

            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;

    }

    public void execute(){

//循环启动Worker线程

        for(Map.Entry<String,Thread> entry:threadMap.entrySet()){

           entry.getValue().start();

        }

    }



}





Worker进程类:



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;

    }

    public void run(){

        while(true){

            Object input = workQueue.poll();//从子任务中取任务执行

            if(input == null) break;

            Object re = handle(input);//这是一个模板方法模式

            resultMap.put(Integer.toString(input.hashCode()),re);

        }

    }

}





PlusWorker进程类:

public class PlusWorker extends Worker {

    public Object handle(Object input){

        Integer i = (Integer)input;

        return i*i*i;

    }

}



测试类:

public class Main {

    public static void  main(String[] args){

        Master m = new Master(new PlusWorker(),5);

        for(int i=0;i<100;i++)

            m.submit(i);

        m.execute();

        int re = 0;

        Map<String,Object> resultMap = m.getResultMap();

        while(resultMap.size() >0 || !m.isCompleted()){

            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);



        }

        System.out.println("re:"+re);

    }

}





Main不用等所有的Worker线程都计算完以后再执行,只要有计算完成的,它就一直计算。







《Java性能优化》 -葛一鸣

多线程模式之MasterWorker模式的更多相关文章

  1. 并行模式之Master-Worker模式

    并行模式之Master-Worker模式 一).Master-Worker模式 作用: 将一个大任务分解成若干个小任务,分发给多个子线程执行. 注: 将大任务分解成小任务,小任务的实现逻辑要相同. 二 ...

  2. 多线程集成设计模式--MasterWorker模式讲解(一)

    Master-Worker模式是常用的并行模式之一,它的核心思想是,系统有两个进程协作工作:Master进程,负责接收和分配任务:Worker进程,负责处理子任务.当Worker进程将子任务处理完成后 ...

  3. 多线程的设计模式--Future模式,Master-Worker模式,生产者-消费者模式

    代码示例: public interface Data { String getRequest(); } public class FutureData implements Data{ privat ...

  4. Java多线程编程中Future模式的详解

    Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...

  5. 并行设计模式(二)-- Master-Worker模式

    Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Mast ...

  6. 深入理解[Master-Worker模式]原理与技术

    Master-Worker模式是常用的并行模式之一.它的核心思想是,系统由两类进程协作工作:Master进程和Worker进程.Master进程负责接收和分配任务,Worker进程负责处理子任务.当各 ...

  7. Java多线程编程中Future模式的详解<转>

    Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...

  8. Java多线程Master-Worker模式

    Java多线程Master-Worker模式,多适用于需要大量重复工作的场景中. 例如:使用Master-Worker计算0到100所有数字的立方的和 1.Master接收到100个任务,每个任务需要 ...

  9. 14.多线程设计模式 - Master-Worker模式

    多线程设计模式 - Master-Worker模式 并发设计模式属于设计优化的一部分,它对于一些常用的多线程结构的总结和抽象.与串行相比并行程序结构通常较为复杂,因此合理的使用并行模式在多线程并发中更 ...

随机推荐

  1. win 8.1 网卡

    win 8.1无线网卡是好的,驱动正常.但是搜索不到附近网络

  2. CentOS7 IP自动获取

    /etc/sysconfig/network-scripts HWADDR=00:15:5D:00:76:04TYPE=EthernetBOOTPROTO=dhcpDEFROUTE=yesPEERDN ...

  3. 掌握 ActionResult

    我在上一篇博客不要停留在表面,MVC 3 我们要深入一些 说明了我们的掌握程度还是不够,还需要我们继续努力.但是有园友质疑说他们认为我说的只是书院派,并不实用,这令作为程序员的我很是生气.好吧,那咱们 ...

  4. 动态获取爱奇艺上传视频mp4格式url地址

    有时候,在工作中有些客户需要用到视频,我们大家都知道视频是非常的耗费流量的,因此,如果因为项目要求客户单独买台视频服务器是非常划不来的.那么将视频上传到优酷,爱奇艺等视频网站来托管那是一件很好的解决方 ...

  5. prefix和unprefix

    exports._esModule = true; exports.default = { prefix: function prefix(prop){ if (prop[0] === '-'){ v ...

  6. 前端资源多个产品整站一键打包&包版本管理(二)——如何在bower的配置文件加上注释

    问题: 当一个工程里面有好几个项目,每个项目引用同一个包,但是不同的名字,例如在bower中 fancybox 跟 jquery.fancybox 是一样的,我们只需要下载其中的一个版本,而打包工作不 ...

  7. x86与x64与x86_64

    x86是指intel的开发的一种32位指令集,从386开始时代开始的,一直沿用至今,是一种cisc指令集,所有intel早期的cpu,amd早期的cpu都支持这种指令集,ntel官方文档里面称为“IA ...

  8. hdu 2191 珍惜现在,感恩生活 多重背包入门题

    背包九讲下载CSDN 背包九讲内容 多重背包: hdu 2191 珍惜现在,感恩生活 多重背包入门题 使用将多重背包转化为完全背包与01背包求解: 对于w*num>= V这时就是完全背包,完全背 ...

  9. codeforces edu round3

    B. The Best Gift  传送门:http://codeforces.com/problemset/problem/609/B Emily's birthday is next week a ...

  10. linux sed 批量替换多个文件中的字符

    格式: sed -i "s/查找字段/替换字段/g" `grep 查找字段 -rl 路径` linux sed 批量替换多个文件中的字符串 sed -i "s/oldst ...