首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

並行設計模式實戰:Master-Worker 模式原理與代碼實現

     編輯:Java 綜合教學

模式簡介

Master-Worker 是經典並行設計模式,將大任務分解為多個子任務並發處理,提升系統吞吐量。核心角色:

  • Master:接收任務、分解子任務、分配給 Worker、聚合結果
  • Worker:處理具體子任務,返回結果
  • Client:提交任務,異步獲取結果

結構設計

Master 維護三個核心數據結構:

  • 任務隊列 Queue<Object> workQueue(線程安全用 ConcurrentLinkedQueue)
  • Worker 線程映射 Map<String, Thread> threadMap
  • 結果集 Map<String, Object> resultMap

核心代碼實現

Master 類

public class Master {
    protected Queue workQueue = new ConcurrentLinkedQueue<>();
    protected Map threadMap = new HashMap<>();
    protected Map resultMap = new HashMap<>();

    public Master(Worker worker, int workerCount) {
        worker.setWorkQueue(workQueue);
        worker.setResultMap(resultMap);
        for (int i = 0; i < workerCount; i++) {
            threadMap.put(String.valueOf(i), new Thread(worker, String.valueOf(i)));
        }
    }

    public void submit(Object task) { workQueue.add(task); }

    public void execute() {
        for (Thread t : threadMap.values()) t.start();
    }

    public boolean isComplete() {
        for (Thread t : threadMap.values()) {
            if (t.getState() != Thread.State.TERMINATED) return false;
        }
        return true;
    }

    public Map getResultMap() { return resultMap; }
}

Worker 抽象類

public abstract class Worker implements Runnable {
    protected Queue workQueue;
    protected Map resultMap = new HashMap<>();

    public void setWorkQueue(Queue workQueue) { this.workQueue = workQueue; }
    public void setResultMap(Map resultMap) { this.resultMap = resultMap; }

    protected abstract Object handle(Object input);

    @Override
    public void run() {
        while (true) {
            Object input = workQueue.poll();
            if (input == null) break;
            Object result = handle(input);
            resultMap.put(String.valueOf(input.hashCode()), result);
        }
    }
}

實戰案例:計算 1-100 立方和

具體 Worker

public class PlusWorker extends Worker {
    @Override
    public Object handle(Object input) {
        Integer i = (Integer) input;
        return i * i * i;
    }
}

Client 協調邏輯

public class Client {
    public static void main(String[] args) {
        Master master = new Master(new PlusWorker(), 5); // 5 個 Worker
        for (int i = 0; i < 100; i++) master.submit(i);
        master.execute();

        int sum = 0;
        Map resultMap = master.getResultMap();
        // 邊計算邊聚合,無需等待所有 Worker 結束
        while (resultMap.size() > 0 || !master.isComplete()) {
            String key = resultMap.keySet().iterator().next();
            Integer val = (Integer) resultMap.remove(key);
            if (val != null) sum += val;
        }
        System.out.println("1^3 + 2^3 + ... + 100^3 = " + sum);
    }
}

關鍵優勢

  • 異步非阻塞:Master 提交任務即返回,Client 可輪詢部分結果聚合
  • 動態擴展:Worker 數量可配置,適應不同硬件資源
  • 容錯性:單個 Worker 失敗不影響整體,可重試機制
  • 解耦:任務分解邏輯與具體計算邏輯分離

應用場景

  • 批量數據處理(ETL、報表生成)
  • 並行計算(科學計算、圖像處理)
  • 分布式任務調度框架基礎模型
  • 高併發請求拆分處理
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved