什么是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<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 handle = handle(input);
resultMap.put(Integer.toString(input.hashCode()), handle);
}
}
}
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 handle = handle(input);
resultMap.put(Integer.toString(input.hashCode()), handle);
}
}
}
具体实现:
public class PlusWorker extends Worker{
public Object handle(Object input) {
//具体实现
return super.handle(input);
}
}
public Object handle(Object input) {
//具体实现
return super.handle(input);
}
}
(2)Master
public class Master {
protected Queue<Object> workQueue = new ConcurrentLinkedQueue<Object>();
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> 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<count;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;
}
public void execute(){
for (Map.Entry<String, Thread> entry : threadMap.entrySet()) {
entry.getValue().start();
}
}
}
protected Queue<Object> workQueue = new ConcurrentLinkedQueue<Object>();
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> 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<count;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;
}
public void execute(){
for (Map.Entry<String, Thread> 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<String, Object> resultMap = m.getResultMap();
while(resultMap.size()>0 || !m.isComplete()){
Set<String> 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);
}
}
}
}
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<String, Object> resultMap = m.getResultMap();
while(resultMap.size()>0 || !m.isComplete()){
Set<String> 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);
}
}
}
}