多线程设计模式-- Master-Worker模式

    xiaoxiao2026-08-08  16

    什么是Master-Worker模式? Master-Worker模式是常用的并行模式,其核心思想是,系统由两类进程协作,Master进程负责接收和分配任务,Worker进程负责处理子任务。当各个Worker进程处理完子任务的时候,有Master接收Worker的处理结果,并进行归纳和汇总。 使用Master-Worker模式的好处 使用Master-Worker模式的好处在于,它能将一个比较庞大的任务分解成若干个小任务,并行执行,从而提高系统的吞吐量。此外,对于系统的请求者来说,任务一旦提交,Master进程会分配任务并立即返回,并不会等待系统全部处理完成后再返回,其处理过程是一步的,这样一来,系统就不会出现等待现象。 Master-Worker模式的主要角色 Worker:用于实际处理子任务。 Master:用于任务的分配和最终结果的合成。 Main:调度开启Master Master-Worker的代码实现

    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>(); /** * 判断是否所有的子任务都结束了 * @return */ 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的进程数量 * @param worker * @param countWorker */ 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))); } } /** * 提交一个任务 * @param job */ public void submit(Object job){ workQueue.add(job); } /** * 返回子任务结果集 * @return */ public Map<String,Object> getResultMap(){ return resultMap; } /** * 开始运行所有的Worker进程,进行处理 */ public void execute(){ for(Map.Entry<String, Thread> entry : threadMap.entrySet()){ entry.getValue().start(); } } } public class Worker implements Runnable{ protected Queue<Object> workQueue; protected Map<String,Object> 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); } } public void setWorkQueue(Queue<Object> workQueue) { this.workQueue = workQueue; } public void setResultMap(Map<String, Object> resultMap) { this.resultMap = resultMap; } } /**计算1~100的立方和**/ public class PlusWorker extends Worker{ public Object handle(Object input){ Integer i = (Integer) input; return i*i*i; } } public class Sum{ public static void main(String[] args){ Master master = new Master(new PlusWorker(), 5); for(int i =0;i<100;i++){ master.submit(i); } master.execute(); int re =0; Map<String,Object> resultMap = master.getResultMap(); while(resultMap.size()>0||!master.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(re); } }
    转载请注明原文地址: https://ju.6miu.com/read-1310983.html
    最新回复(0)