工作示意圖如下圖所示:
它的優勢在於將一個大的任務分解成一個個的子任務並行執行,提高程序執行效率。
代碼示例:
Master進程類:
public class Master {
protected Queue<Object> workQueue = new ConcurrentLinkedQueue<Object>();//存放子任務
protected Map<String,Thread> threadMap = new HashMap<String,Thread>();//存放Worker線程
protected Map<String,Object> resultMap = new ConcurrentHashMap<String, Object>();//存放返回結果集
public boolean isCompleted(){
for(Map.Entry<String,Thread> entry:threadMap.entrySet()){
if(entry.getValue().getState() != Thread.State.TERMINATED){
return false;
}
}
return true;
}
public Master(Worker worker,int countWorker){
worker.setWorkQueue(workQueue);
worker.setResultMap(resultMap);
for(int i=0;i<countWorker;i++){//創建多個Worker線程
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;
}
public void execute(){
//循環啓動Worker線程
for(Map.Entry<String,Thread> entry:threadMap.entrySet()){
entry.getValue().start();
}
}
}
Worker進程類:
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;
}
public void run(){
while(true){
Object input = workQueue.poll();//從子任務中取任務執行
if(input == null) break;
Object re = handle(input);//這是一個模板方法模式
resultMap.put(Integer.toString(input.hashCode()),re);
}
}
}
PlusWorker進程類:
public class PlusWorker extends Worker {
public Object handle(Object input){
Integer i = (Integer)input;
return i*i*i;
}
}
測試類:
public class Main {
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 re = 0;
Map<String,Object> resultMap = m.getResultMap();
while(resultMap.size() >0 || !m.isCompleted()){
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("re:"+re);
}
}
Main不用等所有的Worker線程都計算完以後再執行,只要有計算完成的,它就一直計算。
《Java性能優化》 -葛一鳴