一. 介绍

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

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

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

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

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

模式结构如下图所示:

二. 基本代码实现

Master 进程:

class Master{
private Queue<Integer> workerQueue = new ConcurrentLinkedQueue<Integer>(); private Map<String, Object> resultMap = new HashMap<String,Object>(); private List<Thread> threadList = new ArrayList<Thread>(); public Master(Worker worker){
worker.setWorkerQueue(workerQueue);
worker.setResultMap(resultMap); for(int i=0; i<5; i++){ //比如,开5个子进程
threadList.add(new Thread(worker));
}
} public Map<String, Object> getResultMap(){
return resultMap;
} public void execute(){
for(Thread thread: threadList){
thread.start();
}
} //判断所有子进程是否结束了
public Boolean isCompleted(){
for(Thread thread: threadList){
if(thread.getState() != Thread.State.TERMINATED){
return false;
}
}
return true;
}
}

Worker 进程

class Worker implements Runnable{
private Queue<Integer> workerQueue; private Map<String, Object> resultMap; public void setResultMap(Map map){
this.resultMap = map;
}
public Map<String, Object> getResultMap(){
return resultMap;
}
public void setWorkerQueue(Queue workerQueue){
this.workerQueue = workerQueue;
} public void handle(Object task){
// TODO
/**
* 此处就是任务处理程序
* */
} @Override
public void run() {
// TODO
Object task = workerQueue.poll();
if(task != null){
handle(task);
}
}
}

主函数:

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

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

最新文章

  1. YY一下十年后的自己
  2. MapReduce的ReduceTask任务的运行源码级分析
  3. bitbucket和Mercurial安装和相关
  4. Easyui Layout Center 全屏方法扩展
  5. js获取多个标签元素的内容,并根据元素的内容修改标签的属性
  6. codeforces 617BChocolate
  7. OC3_歌词解析
  8. Oracle EBS-SQL (INV-6):检查监督帐户别名处理.sql
  9. Android开发阅读文档资源
  10. consistent.go 源码阅读
  11. (转)RBAC权限模型——项目实战
  12. 基础JAVA程序设计 (多个类方法的实现)
  13. asp.net 下载视频 保存视屏
  14. 19. vue的原理
  15. ViewPager制作APP引导页+若干动画效果
  16. 【Java初探01】——Java简介及相关
  17. Oracle EBS OM 登记订单
  18. HTTP 请求未经客户端身份验证方案“Anonymous”授权。
  19. poj3680
  20. UVA 10617 Again Palindrome 区间DP

热门文章

  1. iPad iOS8.0升级和Xcode 6.0.1公布了,附Xcode 6.0.1下载地址
  2. pandas dataframe 做机器学习训练数据=》直接使用iloc或者as_matrix即可
  3. 详细图解mongodb下载、安装、配置与使用
  4. String methods
  5. The while statement
  6. 15.map映射
  7. ubuntu16.04下snort的安装(官方文档安装)(图文详解)
  8. windows如何批量添加路由表
  9. 支付宝SDK集成加密库迁移错误问题
  10. tf.nn.softmax(logits,name=None)