java 多线程并发设计模式之二: Master worker 模式应用
By:Roy.LiuLast updated:2014-03-23
在多线程程序设计中Master worker 模式是常用的并行模式之一,核心思想是由两类进程协助完成的,Master 进程负责接收和分配任务并保存结果集,Worker 负责处理任务, 并把结果返回给Master 进程. 这类设计模式最大的好处是 将一个大任务分配成若干个小任务并行执行。下面是一个简单的Master-Worker模式的框架
Master.java
Worker.java
注意这里面用到了java concurrent 包中的. ConcurrentLinkedQueue, ConcurrentHashMap, 这是线程安全的类. 下面是一个测试例子,计算1-100 的立方和. 过程如下:首先继承 Worker 类 实现一个 PlusWorker 的类,orerride handle 方法. 然后提交100个任务,开始计算.
由此可见master-worker 模式适合与将大任务化成小任务并行执行的情况,各个小任务基本独立运行. 测试例子下载:
java multiple master worker pattern
Master.java
package com.yihaomen.masterwork; import java.util.HashMap; import java.util.Map; import java.util.Queue; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; public class Master { //任务队列 protected Queue
Worker.java
package com.yihaomen.masterwork; import java.util.Map; import java.util.Queue; public class Worker implements Runnable{ //任务队列,用于取得子任务 protected QueueworkQueue; //子任务处理结果集 protected Map resultMap; public void setWorkQueue(Queue workQueue) { this.workQueue = workQueue; } public void setResultMap(Map resultMap) { this.resultMap = resultMap; } //子任务处理的逻辑,在子类中实现具体逻辑 public Object handle(Object input){ return input; } @Override public void run() { while (true) { //获取子任务 Object input = workQueue.poll(); if (input == null) break; //处理子任务 Object re=handle(input); //将处理结果写入结果集 resultMap.put(Integer.toString(input.hashCode()), re); } } }
注意这里面用到了java concurrent 包中的. ConcurrentLinkedQueue, ConcurrentHashMap, 这是线程安全的类. 下面是一个测试例子,计算1-100 的立方和. 过程如下:首先继承 Worker 类 实现一个 PlusWorker 的类,orerride handle 方法. 然后提交100个任务,开始计算.
package com.yihaomen.masterwork; import java.util.Map; import java.util.Set; import org.junit.Test; public class TestMasterWorker { public class PlusWorker extends Worker{ public Object handle(Object input){ Integer i=(Integer)input; return i*i*i; } } @Test public void testMasterWorker() { Master m=new Master(new PlusWorker(),5); for(int i=0;i<100;i++) m.submit(i); m.execute(); int re=0; MapresultMap=m.getResultMap(); while(resultMap.size()>0 || !m.isComplete()){ Set 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("testMasterWorker:"+re); } @Test public void testPlus(){ int re=0; for(int i=0;i<100;i++){ re+=i*i*i; } System.out.println("testPlus:"+re); } }
由此可见master-worker 模式适合与将大任务化成小任务并行执行的情况,各个小任务基本独立运行. 测试例子下载:
java multiple master worker pattern
From:一号门
Previous:java 多线程并发设计模式之一: Future 模式应用
COMMENTS