该模式通过将任务拆分,多个worker线程共同处理任务,最终返回结果给master,由master组装最终结果。
一、master
需要保存的数据
1、任务队列,需要注意线程安全,保存需要处理的数据
2、worker线程队列
3、子任务处理结果集,需要注意线程安全
构造器
需要传入worker和线程数量,建立worker线程,存入worker线程队列中
需要的方法如下
1、分解任务存入任务队列
2、启动所有的worker线程
3、返回任务任务的子结果集
4、判断所有worker线程是否执行完
二、worker
需要保存的数据
1、任务队列,保存需要处理的数据,和master共用
2、子任务处理结果集,和master共用
需要的方法如下
1、从master中获得任务队列
2、从master中获得初始的空结果集
3、返回结果集
4、任务处理逻辑
5、线程逻辑,从任务队列中出队尚未处理的数据,如果没有数据,则结束线程,否则处理任务,将结果添加到结果集
以下给一个多线程进行两个集合比较的例子。线程根据cpu核数给,不要给太大。当集合在1000的时候多线程开始有优势,10000的话提升效率非常明显
master
package com.wlf.demo.masterWorker.master;
import java.util.HashMap;
import java.util.Map;
import java.util.Queue;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue;
import com.wlf.demo.masterWorker.worker.Worker;
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 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 boolean isComplete() {
for(Map.Entry<String, Thread> entry : threadMap.entrySet()) {
if(entry.getValue().getState() != Thread.State.TERMINATED)
//存在为完成的线程
return false;
}
return true;
}
//提交一个任务
public void submit(Object data) {
workQueue.add(data);
}
//返回任务结果集
public Map<String, Object> getResultMap() {
return resultMap;
}
//执行所有