并行程序设计模式之 -> Master-Worker模式

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);
	}

}
发布了176 篇原创文章 · 获赞 1 · 访问量 7146

猜你喜欢

转载自blog.csdn.net/qq_37769323/article/details/104202504