多线程模式之MasterWorker模式
工作示意图如下图所示:
它的优势在于将一个大的任务分解成一个个的子任务并行执行,提高程序执行效率。
代码示例:
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性能优化》 -葛一鸣
转载于:https://www.cnblogs.com/xchsp/p/4317245.html
多线程模式之MasterWorker模式相关推荐
- furture模式和masterWorker模式
2019独角兽企业重金招聘Python工程师标准>>> future模式类似于网购过程,提交订单等待签收就可以了. 转载于:https://my.oschina.net/u/3357 ...
- Java多线程编程中Future模式的详解
转载自 https://www.cnblogs.com/winkey4986/p/6203225.html Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker ...
- 并发设计模式之Master-Worker模式
Master-Worker模式是常用的并行模式之一.它的核心思想是,系统由两类进程协作工作:Master进程和Worker进程.Master进程复杂接受和分配任务,Worker进程负责处理子任务.当各 ...
- Java Master-Worker模式实现
Master-Worker模式简介 Master-Worker模式是非常经典的常用的一个并行计算模式,它的核心思想是2类进程协作工作:Master进程和Worker进程.Master负责接收客户端请求 ...
- 【slighttpd】基于lighttpd架构的Server项目实战(3)—MasterWorker模式
转载地址:https://blog.csdn.net/jiange_zh/article/details/50636180 现在,我们开始一步步构建我们的项目了- Master-Worker模式 本次 ...
- 并行程序设计模式--Master-Worker模式
#Copy from http://www.cnblogs.com/Leo_wl/p/5319735.html Master-Worker模式 并行程序设计模式–Master-Worker模式 简介 ...
- Java多线程案例——单例模式(恶汉模式和懒汉模式)
一,什么是单例模式 单例顾名思义指的是单个实例对象(所以单例模式要求构造方法私有化才能保证在类外不能创建该类的实例化对象):在有的场景中,不应该创建多个对象时就应该使用单例模式,一旦使用了单例模式,此 ...
- Linux下sqlite3多线程和串行模式
sqlite3支持三种模式:单线程模式,多线程模式和串行模式. 模式可在编译,启动时或运行时设置,一般来讲,启动时的设置会覆盖编译时的设置,运行时则会覆盖启动时或编译时的设置.但是一旦单线程模式被设置 ...
- WCF学习之旅—请求与答复模式和单向模式(十九)
一.概述 WCF在通信过程中有三种模式:请求与答复.单向.双工通信.以下我们一一介绍. 二.请求与答复模式 客户端发送请求,然后一直等待服务端的响应(异步调用除外),期间处于假死状态,直到服务端有了答 ...
最新文章
- 可观察性驱动开发,探索未知之地
- Delphi中DLL封装业务逻辑的实现
- 免费报名!百度大脑开放日·互联网内容安全线上专场来袭
- 通过地址访问 mysql_MySql通过ip地址进行访问的方法
- dcloud会员激活mui
- [leetcode] Palindrome Number 回文数判断
- 【干货】无人机如何进行倾斜摄影的航线规划
- 机器视觉:工业镜头专业词汇中英文详解
- 如何使Git使用我选择的编辑器进行提交?
- springbootredis连接池配置优化_spring boot rest 接口集成 spring security(2) – JWT配置
- mysql 插入数据 自增长_mysql插入数据后返回自增ID的方法
- ZStack 3.6.0发布:支持云主机从KVM云平台在线迁移至ZStack
- 房地产项目动态计划管理系统
- 悬崖帝国中文版下载|悬崖帝国中文破解版下载 v1.0绿色免安装版
- Android之制作Nine-Patch图片
- OpenAI的API key获取方法
- MySQL免安装版配置部署详细教程
- 计算机应用蘑菇丁周报,蘑菇钉周记(共10篇)
- 数据中心服务器机柜内的信息点数
- 14家国内外医药行业协会于国际医药创新大会联合签署《医药创新宣言》
热门文章
- vb和python-vb与python
- python编程入门书籍推荐-给刚入门python的朋友推荐几本书
- python百度百科api-python使用API
- python啥意思-python是什么意思
- python应该怎么自学-Python 应该怎么学?
- 学python的主流就业方向-Python有哪些就业方向 你知道Python的优势吗
- python基础语法有哪些-Python基础语法知识有哪些?
- 自学python需要多长时间-零基础自学python要多久?
- python菜鸟工具-终于清楚python菜鸟入门教程
- c+还是python好-既然C+不如Java、Python,为什么还要学C+?