成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

并發(fā)編程中級(jí)篇二----并行設(shè)計(jì)模式----Master-Wroker模式

RebeccaZhong / 3612人閱讀

摘要:模式是常用的并行計(jì)算模式,它的核心思想是系統(tǒng)是由兩類進(jìn)程協(xié)助工作。負(fù)責(zé)接收和分配任務(wù),負(fù)責(zé)處理子任務(wù)。當(dāng)各個(gè)子進(jìn)程處理完成后,會(huì)返回結(jié)果給,由做歸納和總結(jié)。其好處是能將一個(gè)大任務(wù)分解成若干個(gè)小任務(wù),并行執(zhí)行,從而提高系統(tǒng)的吞吐量。

Master-worker模式是常用的并行計(jì)算模式,它的核心思想是系統(tǒng)是由兩類進(jìn)程協(xié)助工作。Master負(fù)責(zé)接收和分配任務(wù),worker負(fù)責(zé)處理子任務(wù)。當(dāng)各個(gè)worker子進(jìn)程處理完成后,會(huì)返回結(jié)果給master,由master做歸納和總結(jié)。其好處是能將一個(gè)大任務(wù)分解成若干個(gè)小任務(wù),并行執(zhí)行,從而提高系統(tǒng)的吞吐量。

1.定義一個(gè)要執(zhí)行的任務(wù)類

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

2.定義Master負(fù)責(zé)收發(fā)任務(wù)

    //注意worker線程的數(shù)量 根據(jù)機(jī)器的性能來(lái)添加
    //Runtime.getRuntime().availableProcessors()
    public class Master{
        
        //1.定義一個(gè)盛放任務(wù)的容器
        private ConcurrentLinkedQueue workQueue = 
        new ConcurrentLinkedQueue();
                
        //2.需要一個(gè)盛放worker的集合
        private HashMap workers = 
        new HashMap();
        
        //3.需要一個(gè)盛放每一個(gè)worker執(zhí)行任務(wù)的結(jié)果集合
        private ConcurrentHashMap resultMap = 
        new ConcurrentHashMap();
        
        //4.定義一個(gè)構(gòu)造方法
        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需要一個(gè)執(zhí)行提交任務(wù)的方法
        public void submit(Task task){
            this.workQueue.add(task);
        }
        
        //6需要一個(gè)執(zhí)行任務(wù)的方法 啟動(dòng)所有的worker方法去執(zhí)行任務(wù)
        public void execute(){
            for(Map.Entry me : workers.entrySet()){
                me.getValue().start();
            }
        }
        
        //7判斷運(yùn)行是否結(jié)束的方法
        public boolean isComplete(){
            for(Map.Entry me : workers.entrySet()){
                if(me.getValue().getState() != Thread.State.TERMINATED){
                    return false;
                }
            }        
            return true;
        }
        
        //8 計(jì)算結(jié)果方法
        public int getResult() {
            int priceResult = 0;
            for(Map.Entry me : resultMap.entrySet()){
                priceResult += (Integer)me.getValue();
            }
            return priceResult;
        }
    }

3.定義一個(gè)worker處理子任務(wù)

    public class Worker implements Runnable{
        
        private ConcurrentLinkedQueue workQueue;
        private ConcurrentHashMap resultMap;
        
        public void setWorkQueue(ConcurrentLinkedQueue workQueue) {
            this.workQueue = workQueue;
        }
    
        public void setResultMap(ConcurrentHashMap 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 {
                //處理任務(wù)的耗時(shí)。。 比如說(shuō)進(jìn)行操作數(shù)據(jù)庫(kù)。。。
                Thread.sleep(500);
                output = input.getPrice();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return output;
        }
    }

4.定義一個(gè)測(cè)試類

    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("最終結(jié)果:" + priceResult + 
                    ", 執(zhí)行時(shí)間:" + end);
                    break;
                }
            }        
         }
    }
   

結(jié)果如下

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/70413.html

相關(guān)文章

  • 并發(fā)編程中級(jí)篇二----并行設(shè)計(jì)模式----Future模式

    摘要:模式類似于用戶提交商品訂單,下單成功以后后臺(tái)異步的執(zhí)行耗時(shí)的業(yè)務(wù)在包中接口是線程模式的實(shí)現(xiàn),可以來(lái)進(jìn)行異步計(jì)算。 Future模式類似于用戶提交商品訂單,下單成功以后后臺(tái)異步的執(zhí)行耗時(shí)的業(yè)務(wù)在java.util.concurrent包中.Future接口是Java線程Future模式的實(shí)現(xiàn),可以來(lái)進(jìn)行異步計(jì)算。 showImg(https://segmentfault.com/img/...

    lx1036 評(píng)論0 收藏0
  • 并發(fā)編程中級(jí)篇三----并行設(shè)計(jì)模式----生產(chǎn)者-消費(fèi)者模式

    摘要:生產(chǎn)者消費(fèi)者模式是一個(gè)經(jīng)典的多線程設(shè)計(jì)模式,它為多線程的協(xié)作提供了良好的解決方案。生產(chǎn)者消費(fèi)者模式中的內(nèi)存緩沖區(qū)的主要功能是數(shù)據(jù)在多線程間的共享。 生產(chǎn)者-消費(fèi)者模式是一個(gè)經(jīng)典的多線程設(shè)計(jì)模式,它為多線程的協(xié)作提供了良好的解決方案。在生產(chǎn)者-消費(fèi)者模式中,通常有兩類線程,即若干個(gè)生產(chǎn)者線程和若干個(gè)消費(fèi)者線程。生產(chǎn)者線程負(fù)責(zé)提交用戶請(qǐng)求,消費(fèi)者線程負(fù)責(zé)處理用戶請(qǐng)求。生產(chǎn)者和消費(fèi)者之間通過(guò)...

    Aldous 評(píng)論0 收藏0
  • 學(xué)習(xí)Java必讀的10本書(shū)籍

    摘要:學(xué)習(xí)編程的本最佳書(shū)籍這些書(shū)涵蓋了各個(gè)領(lǐng)域,包括核心基礎(chǔ)知識(shí),集合框架,多線程和并發(fā),內(nèi)部和性能調(diào)優(yōu),設(shè)計(jì)模式等。擅長(zhǎng)解釋錯(cuò)誤及錯(cuò)誤的原因以及如何解決簡(jiǎn)而言之,這是學(xué)習(xí)中并發(fā)和多線程的最佳書(shū)籍之一。 showImg(https://segmentfault.com/img/remote/1460000018913016); 來(lái)源 | 愿碼(ChainDesk.CN)內(nèi)容編輯 愿碼Slo...

    masturbator 評(píng)論0 收藏0
  • 你和阿里資深架構(gòu)師之間,差的不僅僅是年齡(進(jìn)階必看)

    摘要:導(dǎo)讀閱讀本文需要有足夠的時(shí)間,筆者會(huì)由淺到深帶你一步一步了解一個(gè)資深架構(gòu)師所要掌握的各類知識(shí)點(diǎn),你也可以按照文章中所列的知識(shí)體系對(duì)比自身,對(duì)自己進(jìn)行查漏補(bǔ)缺,覺(jué)得本文對(duì)你有幫助的話,可以點(diǎn)贊關(guān)注一下。目錄一基礎(chǔ)篇二進(jìn)階篇三高級(jí)篇四架構(gòu)篇五擴(kuò) 導(dǎo)讀:閱讀本文需要有足夠的時(shí)間,筆者會(huì)由淺到深帶你一步一步了解一個(gè)資深架構(gòu)師所要掌握的各類知識(shí)點(diǎn),你也可以按照文章中所列的知識(shí)體系對(duì)比自身,對(duì)自己...

    huaixiaoz 評(píng)論0 收藏0
  • 2021年10月6日 軟考中級(jí)筆記---軟件設(shè)計(jì)師(B站視頻筆記)

    摘要:死鎖問(wèn)題可以預(yù)防,可以解決死鎖年月日數(shù)據(jù)庫(kù)的完整性約束實(shí)體完整性約束定義主鍵。主鍵不能為空,不能重復(fù)參照完整性約束外鍵。系統(tǒng)需要進(jìn)行多次連接,才能進(jìn)行查詢操作,是的系統(tǒng)效率大大下降。 ...

    superPershing 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<