Java中的线程(五)- Master-Worker模式

什么是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);
}
}
}
具体实现:
public class PlusWorker extends Worker{
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();
}
}
}
(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);
}
}

}
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值