Chinaunix首页 | 论坛 | 博客
  • 博客访问: 232283
  • 博文数量: 75
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 848
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-08 10:27
文章分类
文章存档

2014年(9)

2013年(66)

我的朋友

分类: Java

2013-11-10 10:56:30

什么是Master-Worker模式
Master-Worker模式(有些时候也称作Master-Slave 或者 Map-Reduce模式)是用来并行处理。是通过master和worker线程或进程的协作完成计算,其中master进程负责接收并分配任务,worker负责处理各个子任务,当worker将子任务完成后返回给master,由master进行归纳和总结。
Master-Worker模式参与者
角色 作用
Main 调用Master,提交任务
Master 分配任务,处理结果
Worker 完成子任务
代码实现
(1)Worker
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;
}
public void run() {
while(true){
Object input = workQueue.poll();
if(input == null)break;
Object handle = handle(input);
resultMap.put(Integer.toString(input.hashCode()), handle);
}
}
}
具体实现:
public class PlusWorker extends Worker{
public Object handle(Object input) {
//具体实现
return super.handle(input);
}
}
(2)Master
public class Master {
protected Queue workQueue = new ConcurrentLinkedQueue();
protected Map threadMap = new HashMap();
protected Map resultMap = new ConcurrentHashMap();
public boolean isComplete(){
for(Map.Entry emtry: threadMap.entrySet()){
if(emtry.getValue().getState() != Thread.State.TERMINATED){
return false;
}
}
return true;
}
public Master(Worker worker,int count){
worker.setWorkQueue(workQueue);
worker.setResultMap(resultMap);
for(int i=0;i threadMap.put(Integer.toString(i), new Thread(worker,Integer.toString(i)));
}
}
public void submit(Object job){
workQueue.add(job);
}
public Map getResultMap(){
return resultMap;
}
public void execute(){
for (Map.Entry entry : threadMap.entrySet()) {
entry.getValue().start();
}
}
}
(3)Main
public class TestMaster {
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 result=0;
Map resultMap = m.getResultMap();
while(resultMap.size()>0 || !m.isComplete()){
Set keySet = resultMap.keySet();
String key =null;
for(String k : keySet){
key = k;
break;
}
Integer i = null;
if(key != null){
i = (Integer)resultMap.get(key);
}
if(i != null){
result += i;
System.out.println("result"+result);
}
if(key != null){
resultMap.remove(key);
}
}


}
}
阅读(1380) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~