多執行緒設計模式 Master Worker模式

2021-10-01 19:19:31 字數 2128 閱讀 6951

master-worker是常用的平行計算模式。它的核心思想是系統由兩類程序協作工作:master程序和worker程序。

master負責接收和分配任務,worker負責處理子任務。當各個worker子程序處理完成後,會將結果返回給master,由master作歸納總結。

其好處就是能將乙個大任務分解成若干個小任務,並行執行,從而提高系統的吞吐量。

處理過程如下圖所示:

master程序為主要程序,它維護乙個worker程序佇列、子任務佇列和子結果集。worker程序佇列中的worker程序不停從任務佇列中提取要處理的子任務,並將結果寫入結果集。

根據上面的思想,我們來模擬一下這種經典設計模式的實現。

既然worker是具體的執行任務,那麼worker一定要實現runnable介面

matser作為接受和分配任務,得先有個容器來裝載使用者發出的請求,在不考慮阻塞的情況下我們選擇concurrentlinkedqueue作為裝載容器

worker物件需要能從master接收任務,它也得有master concurrentlinkedqueue容器的引用

master還得有個容器需要能夠裝載所有的worker,可以使用hashmap

worker處理完後需要將資料返回給master,那麼master需要有個容器能夠裝載所有worker併發處理任務的結果集。此容器需要能夠支援高併發,所以最好採用concurrenthashmap

同理由於worker處理完成後將資料填充進master的concurrenthashmap,那麼它也得有乙份concurrenthashmap的引用

public class task 

public void setid(int id)

public string getname()

public void setname(string name)

public int getprice()

public void setprice(int price)

}

public

class

master

}//用於提交任務

public

void

submit

(task task)

//執行方法,啟動應用程式讓所有的worker工作

public

void

execute()

}//判斷所有的執行緒是否都完成任務

public

boolean

iscomplete()

}return

true;}

//總結歸納

public

intgetresult()

return ret;

}}

public

class

worker

implements

runnable

public

void

setresultmap

(concurrenthashmap

resultmap)

@override

public

void

run()}

//核心處理邏輯,可以抽離出來由具體子類實現

private object handle

(task executetask)

catch

(interruptedexception e)

return result;

}}

public

class

main

master.

execute()

;long start = system.

currenttimemillis()

;while

(true)}

}}

在worker物件中的核心處理業務邏輯handle()方法最好抽象成公共方法,具體實現由子類覆寫。

多執行緒設計模式

呼叫類 public class main 介面 public inte ce data 包裝類 public class futureclient start return futuredata 真實資料處理類 public class realdata implements data catch...

多執行緒設計模式

所謂 single threaded execution 即 以乙個執行緒執行 該模式用於設定限制,以確保同一時間內只讓乙個執行緒執行處理。immutable模式中存在著確保例項狀態不發生改變的類 immutable類 在訪問這些例項時並不需要執行耗時的互斥處理,因此若能巧妙利用該模式,定能提高程式...

多執行緒 多執行緒 單例設計模式

多執行緒之 單例設計模式 餓漢式 多執行緒安全 1 餓漢式 class single static single getinstance public void show class a implements runnable class test catch interruptedexceptio...