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 QueueWorker.java
package com.yihaomen.masterwork;
import java.util.Map;
import java.util.Queue;
public class Worker implements Runnable{
//任务队列,用于取得子任务
protected Queue workQueue;
//子任务处理结果集
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;
Map resultMap=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