併發編程中級篇二----並行設計模式----Master-Wroker模式

Master-worker模式是經常使用的並行計算模式,它的核心思想是系統是由兩類進程協助工做。Master負責接收和分配任務,worker負責處理子任務。當各個worker子進程處理完成後,會返回結果給master,由master作概括和總結。其好處是能將一個大任務分解成若干個小任務,並行執行,從而提升系統的吞吐量。數據庫


圖片描述

1.定義一個要執行的任務類dom

public class Task{
        
        private int id;
        
        private int price;
        
        //getter/setter()省略
    }

2.定義Master負責收發任務性能

//注意worker線程的數量 根據機器的性能來添加
    //Runtime.getRuntime().availableProcessors()
    public class Master{
        
        //1.定義一個盛聽任務的容器
        private ConcurrentLinkedQueue<Task> workQueue = 
        new ConcurrentLinkedQueue<Task>();
                
        //2.須要一個盛放worker的集合
        private HashMap<String, Thread> workers = 
        new HashMap<String, Thread>();
        
        //3.須要一個盛放每個worker執行任務的結果集合
        private ConcurrentHashMap<String , Object> resultMap = 
        new ConcurrentHashMap<String,Object>();
        
        //4.定義一個構造方法
        public Master(Worker worker, int workCount){
            worker.setWorkQueue(this.workQueue);
            worker.setResultMap(this.resultMap);
            
            for(int i = 0; i < workerCount; i ++){
                this.workers.put(Integer.toString(i), new Thread(worker));
            }
        }
        
        //5須要一個執行提交任務的方法
        public void submit(Task task){
            this.workQueue.add(task);
        }
        
        //6須要一個執行任務的方法 啓動全部的worker方法去執行任務
        public void execute(){
            for(Map.Entry<String, Thread> me : workers.entrySet()){
                me.getValue().start();
            }
        }
        
        //7判斷運行是否結束的方法
        public boolean isComplete(){
            for(Map.Entry<String, Thread> me : workers.entrySet()){
                if(me.getValue().getState() != Thread.State.TERMINATED){
                    return false;
                }
            }        
            return true;
        }
        
        //8 計算結果方法
        public int getResult() {
            int priceResult = 0;
            for(Map.Entry<String, Object> me : resultMap.entrySet()){
                priceResult += (Integer)me.getValue();
            }
            return priceResult;
        }
    }

3.定義一個worker處理子任務測試

public class Worker implements Runnable{
        
        private ConcurrentLinkedQueue<Task> workQueue;
        private ConcurrentHashMap<String, Object> resultMap;
        
        public void setWorkQueue(ConcurrentLinkedQueue<Task> workQueue) {
            this.workQueue = workQueue;
        }
    
        public void setResultMap(ConcurrentHashMap<String, 
            Object> resultMap) {
            this.resultMap = resultMap;
        }
        
        public void run() {
            while(true){
                Task input = this.workQueue.poll();
                if(input == null) break;
                Object output = handle(input);
                this.resultMap.put(Integer.toString(input.getId()), output);
            }
        }
    
        private Object handle(Task input) {
            Object output = null;
            try {
                //處理任務的耗時。。 好比說進行操做數據庫。。。
                Thread.sleep(500);
                output = input.getPrice();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return output;
        }
    }

4.定義一個測試類this

public class Main{
    
         public static void main(String[] args) {
            
            Master master = new Master();
            
            Random r = new Random();
            for(int i = 1;i <= 100;i++){
                Task t = new Task();
                t.setId(i);
                t.setPrice(r.nextInt(1000));
                master.submit(t);
            }
            master.execute();
            long start = System.currentTimeMills();
            
            while(true){
                if(maste.isComplete()){
                    long end = System.currentTimeMills();
                    int priceResult = master.getResult();
                    System.out.println("最終結果:" + priceResult + 
                    ", 執行時間:" + end);
                    break;
                }
            }        
         }
    }

結果以下
圖片描述spa

相關文章
相關標籤/搜索