package javatuning.ch4.mstrwkr;
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<Object> workQueue = new ConcurrentLinkedQueue<Object>();
//Worker线程队列
protected Map<String,Thread> threadMap=new HashMap<String,Thread>();
//子任务处理结果集
protected Map<String,Object> resultMap = new ConcurrentHashMap<String,Object>();
//是否所有的子任务都结束了
public boolean isComplete(){
for(Map.Entry<String,Thread> entry:threadMap.entrySet()){
if(entry.getValue().getState()!=Thread.State.TERMINATED){
return false;
}
}
return true;
}
//Master的构造,需要一个Worker进程逻辑,和需要的Worker进程数量
public Master(Worker worker,int countWorker){
worker.setWorkQueue(workQueue);
worker.setResultMap(resultMap);
for(int i=0;i<countWorker ;i++)
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;
}
//开始运行所有的Worker进程,进行处理
public void execute(){
for(Map.Entry<String, Thread> entry:threadMap.entrySet()){
entry.getValue().start();
}
}
}
package javatuning.ch4.mstrwkr;
import java.util.Map;
import java.util.Queue;
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;
}
@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);
}
}
}
package javatuning.ch4.mstrwkr;
import java.util.Map;
import java.util.Random;
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<String,Object> resultMap=m.getResultMap();
while(resultMap.size()>0 || !m.isComplete()){
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("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);
}
}