多线程模式之Master-Worker模式

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线程都计算完以后再执行,只要有计算完成的,它就一直计算。

时间: 2024-08-30 12:42:50

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

Master和worker模式

让和hadoop的设计思想是一样的,Master负责分配任务和获取任务的结果,worker是真正处理业务逻辑的. 使用ConcurrentLikedQueue去承载所有的任务,因为会有多个worker会并发修改这个队列. public class Task { private int id; private int price ; public int getId() { return id; } public void setId(int id) { this.id = id; } publi

apache常用的两种工作模式 prefork和worker

apache作为现今web服务器用的最广泛也是最稳定的开源服务器软件,其工作模式有许多中,目前主要有两种模式:prefork模式和worker模式 一.两种模式 prefork模式: prefork是Unix平台上的默认(缺省)MPM,使用多个子进程,每个子进程只有一个线程.每个进程在某个确定的时间只能维持一个连接,效率高,但内存占用量比较大. 这个多路处理模块(MPM)实现了一个非线程型的.预派生的web服务器,它的工作方式类似于Apache 1.3.它适合于没有线程安全库,需要避免线程兼容性

Apache的prefork模式和worker模式

prefork模式这个多路处理模块(MPM)实现了一个非线程型的.预派生的web服务器,它的工作方式类似于Apache 1.3.它适合于没有线程安全库,需要避免线程兼容性问题的系统.它是要求将每个请求相互独立的情况下最好的MPM,这样若一个请求出现问题就不会影响到其他请求. 这个MPM具有很强的自我调节能力,只需要很少的配置指令调整.最重要的是将MaxClients设置为一个足够大的数值以处理潜在的请求高峰,同时又不能太大,以致需要使用的内存超出物理内存的大小. worker模式此多路处理模块(

关于Apache的两种工作模式prefork和worker

prefork模式 这个多路处理模块(MPM)实现了一个非线程型的.预派生的web服务器,它的工作方式类似于Apache 1.3.它适合于没有线程安全库,需要避免线程兼容性问题的系统.它是要求将每个请求相互独立的情况下最好的MPM,这样若一个请求出现问题就不会影响到其他请求. 这个MPM具有很强的自我调节能力,只需要很少的配置指令调整.最重要的是将MaxClients设置为一个足够大的数值以处理潜在的请求高峰,同时又不能太大,以致需要使用的内存超出物理内存的大小. worker模式 此多路处理模

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

Apache两种常用工作模式:prefork和worker. prefork MPM prefork是一个非线程型的.预派生的MPM,使用多个进程,每个进程在某个确定的时间只单独处理一个连接,效率高,但内存使用比较大. 可通过了解prefork的配置认识prefork,配置位置:apache/conf/extra/httpd-mpm.conf <IfModule mpm_prefork_module> StartServers 5 MinSpareServers 5 MaxSpareServe

mongodb之master/slave模式

### mongodb的主从配置(不带auth认证) ### 注意事项: - 服务器节点之前时间要同步 - 开启防火墙的一定要允许通过相关端口 - 开启selinux的也要进行设置 - 建立双击互信模式最好不过 ### master配置文件 - 添加了master = true 这一行即可 - 多网卡机器bind_ip这一行尽可能写成一个具体地址(最好写内网地址),因为slave上是根据这个同步的 [[email protected] ~]# sed -e '/^#/d;/^$/d' /etc/

mongodb之master/slave模式 + auth

## 主从带认证: 主服务器和从服务器必须开启安全认证:--auth, 主服务器和从服务器的admin数据库中必须有全局用户, 然后主服务器的local数据库和从服务器的local数据均有名为repl且密码相同的用户名. 注:local:本地数据库 这个数据库不会同步,主要存放同步的信息.在MongoDB2.0.2版本测试时,从服务器的admin数据库中没有全局用户时也能进行复制(Deven:我们就是采用这个方式, 从服务器admin数据库没有建立用户),尽管admin中无用户,客户端连接此服务

Puppet基于Master/Agent模式实现LNMP平台部署

前言 随着IT行业的迅猛发展,传统的运维方式靠大量人力比较吃力,运维人员面对日益增长的服务器和运维工作,不得不把很多重复的.繁琐的工作利用自动化处理.前期我们介绍了运维自动化工具ansible的简单应用,本期带来的是运维自动化神器puppet基于Master/Agent模式实现LNMP平台部署. Puppet 简介 Puppet是基于ruby语言开发的一种Linux.Unix.Windows平台的集中配置管理系统,可以C/S模式或独立运行,使用自有的puppet描述语言,可管理配置文件.用户.c

yum安装apache后更改worker模式

进入linux命令模式,输入 #yum install httpd                    //安装apache #vi  /etc/sysconfig/httpd            //修改文件,打开worker模式 将#号去掉 重启apache,命令如下 #service httpd restart 报错如下: [root@localhost ~]# service httpd restartStopping httpd:                          

单例模式在多线程环境下的lazy模式为什么要加两个if(instance==null)

刚才在看阿寻的博客”C#设计模式学习笔记-单例模式“时,发现了评论里有几个人在问单例模式在多线程环境下为什么lazy模式要加两个if进行判断,评论中的一个哥们剑过不留痕,给他们写了一个demo来告诉他们为什么. 我看了一下这个demo,确实说明了这个问题,但我认为不够直观,呵呵,于是我就稍微的改了一下. 这是剑过不留痕的demo using System; using System.Threading; namespace SingletonPattern { class Program { s