摘要:模式是常用的并行計算模式,它的核心思想是系統(tǒng)是由兩類進(jìn)程協(xié)助工作。負(fù)責(zé)接收和分配任務(wù),負(fù)責(zé)處理子任務(wù)。當(dāng)各個子進(jìn)程處理完成后,會返回結(jié)果給,由做歸納和總結(jié)。其好處是能將一個大任務(wù)分解成若干個小任務(wù),并行執(zhí)行,從而提高系統(tǒng)的吞吐量。
Master-worker模式是常用的并行計算模式,它的核心思想是系統(tǒng)是由兩類進(jìn)程協(xié)助工作。Master負(fù)責(zé)接收和分配任務(wù),worker負(fù)責(zé)處理子任務(wù)。當(dāng)各個worker子進(jìn)程處理完成后,會返回結(jié)果給master,由master做歸納和總結(jié)。其好處是能將一個大任務(wù)分解成若干個小任務(wù),并行執(zhí)行,從而提高系統(tǒng)的吞吐量。
1.定義一個要執(zhí)行的任務(wù)類
public class Task{ private int id; private int price; //getter/setter()省略 }
2.定義Master負(fù)責(zé)收發(fā)任務(wù)
//注意worker線程的數(shù)量 根據(jù)機(jī)器的性能來添加 //Runtime.getRuntime().availableProcessors() public class Master{ //1.定義一個盛放任務(wù)的容器 private ConcurrentLinkedQueueworkQueue = new ConcurrentLinkedQueue (); //2.需要一個盛放worker的集合 private HashMap workers = new HashMap (); //3.需要一個盛放每一個worker執(zhí)行任務(wù)的結(jié)果集合 private ConcurrentHashMap resultMap = new ConcurrentHashMap (); //4.定義一個構(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需要一個執(zhí)行提交任務(wù)的方法 public void submit(Task task){ this.workQueue.add(task); } //6需要一個執(zhí)行任務(wù)的方法 啟動所有的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 計算結(jié)果方法 public int getResult() { int priceResult = 0; for(Map.Entry me : resultMap.entrySet()){ priceResult += (Integer)me.getValue(); } return priceResult; } }
3.定義一個worker處理子任務(wù)
public class Worker implements Runnable{ private ConcurrentLinkedQueueworkQueue; 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ù)的耗時。。 比如說進(jìn)行操作數(shù)據(jù)庫。。。 Thread.sleep(500); output = input.getPrice(); } catch (InterruptedException e) { e.printStackTrace(); } return output; } }
4.定義一個測試類
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í)行時間:" + end); break; } } } }
結(jié)果如下
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/70413.html
摘要:模式類似于用戶提交商品訂單,下單成功以后后臺異步的執(zhí)行耗時的業(yè)務(wù)在包中接口是線程模式的實現(xiàn),可以來進(jìn)行異步計算。 Future模式類似于用戶提交商品訂單,下單成功以后后臺異步的執(zhí)行耗時的業(yè)務(wù)在java.util.concurrent包中.Future接口是Java線程Future模式的實現(xiàn),可以來進(jìn)行異步計算。 showImg(https://segmentfault.com/img/...
摘要:生產(chǎn)者消費(fèi)者模式是一個經(jīng)典的多線程設(shè)計模式,它為多線程的協(xié)作提供了良好的解決方案。生產(chǎn)者消費(fèi)者模式中的內(nèi)存緩沖區(qū)的主要功能是數(shù)據(jù)在多線程間的共享。 生產(chǎn)者-消費(fèi)者模式是一個經(jīng)典的多線程設(shè)計模式,它為多線程的協(xié)作提供了良好的解決方案。在生產(chǎn)者-消費(fèi)者模式中,通常有兩類線程,即若干個生產(chǎn)者線程和若干個消費(fèi)者線程。生產(chǎn)者線程負(fù)責(zé)提交用戶請求,消費(fèi)者線程負(fù)責(zé)處理用戶請求。生產(chǎn)者和消費(fèi)者之間通過...
摘要:學(xué)習(xí)編程的本最佳書籍這些書涵蓋了各個領(lǐng)域,包括核心基礎(chǔ)知識,集合框架,多線程和并發(fā),內(nèi)部和性能調(diào)優(yōu),設(shè)計模式等。擅長解釋錯誤及錯誤的原因以及如何解決簡而言之,這是學(xué)習(xí)中并發(fā)和多線程的最佳書籍之一。 showImg(https://segmentfault.com/img/remote/1460000018913016); 來源 | 愿碼(ChainDesk.CN)內(nèi)容編輯 愿碼Slo...
摘要:導(dǎo)讀閱讀本文需要有足夠的時間,筆者會由淺到深帶你一步一步了解一個資深架構(gòu)師所要掌握的各類知識點,你也可以按照文章中所列的知識體系對比自身,對自己進(jìn)行查漏補(bǔ)缺,覺得本文對你有幫助的話,可以點贊關(guān)注一下。目錄一基礎(chǔ)篇二進(jìn)階篇三高級篇四架構(gòu)篇五擴(kuò) 導(dǎo)讀:閱讀本文需要有足夠的時間,筆者會由淺到深帶你一步一步了解一個資深架構(gòu)師所要掌握的各類知識點,你也可以按照文章中所列的知識體系對比自身,對自己...
摘要:死鎖問題可以預(yù)防,可以解決死鎖年月日數(shù)據(jù)庫的完整性約束實體完整性約束定義主鍵。主鍵不能為空,不能重復(fù)參照完整性約束外鍵。系統(tǒng)需要進(jìn)行多次連接,才能進(jìn)行查詢操作,是的系統(tǒng)效率大大下降。 ...
閱讀 3272·2021-11-15 11:37
閱讀 1085·2021-11-02 14:45
閱讀 3905·2021-09-04 16:48
閱讀 3582·2019-08-30 15:55
閱讀 757·2019-08-23 17:53
閱讀 1000·2019-08-23 17:03
閱讀 2032·2019-08-23 16:43
閱讀 2191·2019-08-23 16:22