基於ThreadPool的簡單工作管理器

2022-02-14 21:04:14 字數 3270 閱讀 4615

有這樣的場景,**開放平台上有銷售訂單api,銷售訂單金額api,商品上下架api,退款api等各種開放的 api,稍微有點規模的商家都會自己開發基於**平台的資訊管理系統,裡面會涉及到訂單管理,採購管理,庫存管理,售後管理等,這些管理系統裡面的資料都是通過api獲取,或者通過api推送到**平台上,這些系統的好處就是避免工作人員直接在**後台進行各項操作。

基於上面的情況,那麼自然會有很多後台程式來跑這些 api,剛開始我是這樣設計的。

在乙個後台程式裡面開幾個執行緒,每個執行緒對應幾個api,這樣也能夠滿足日常需求,但是隨著業務量增大,會有各種資料或者任務需要處理,這個時候上面的程式也能滿足需求,但是每次都要修改程式,然後在發布,實在是有些頭疼。後來我就想,能不能開發乙個管理平台,來自動管理這些任務,什麼時候想停止任務,直接在配置管理**上點一下按鈕,想開啟也是一樣操作,如果推出這樣的乙個管理平台,那麼像管理這種業務資料的活可以直接丟給店鋪管理人員。

經過一番思考,想到了這樣一種方案,先看圖。

上面的圖可以很清晰看出工作管理模型。其實到這個時候,最最關心還是工作管理器的核心到底是怎樣設計的?那我就說說我的思路是怎樣的。

首先是工作任務執行時間的設計,因為有的api是需要白天執行的有的是晚上閒時執行的,有的是7*24小時不間斷執行的,那麼我們可以設計這樣的乙個列舉,命名worktype,具體內容是:

public

enum

worktype

allwork 的執行時間是全天,worktime的執行時間是早上9點到晚上22點,morning的執行時間是凌晨3點到早上9點,night的執行時間是晚上22點到凌晨3點,相信這幾個時間區域很多開發同事都會涉及到的。

然後是工作執行緒類workthread,將它定義為乙個抽象類,裡面含有乙個抽象方法workrun,每乙個詳細的任務類都會繼承workthread類,實現抽象方法,也就是說,每個任務的業務處理邏輯都是在workrun方法裡面實現的。因為上面提到了任務的執行時間區間,那麼我們在初始化乙個繼承workthread類的時候,會設定它的執行時間區間。然後在這個抽象類中還還有乙個方法,它的作用就是將實現了workthread的類丟到threadpool裡面,看看具體的實現**。

public

abstract

class

workthread

public

int step

public worktype worktype

public

bool

haswork

return

result;}}

public

abstract

void workrun(object

ob);

public

void

run()

public

void

addstep()

}

那麼具體的任務類如下。

public

class

testa : workthread

public

override

void workrun(object

ob)

}

其實到這裡了,有的人會想到,那我們怎麼來管理這些workthread類了,這裡我們專門有乙個類來管理workthread,這裡命名為workmanager。這個類裡面的結構就相當簡單了。看到上面的模型圖,可以猜出一些端倪。裡面專門定義了乙個字典項,用來儲存每乙個workthread,它是concurrentdictionary,表示可由多個執行緒同時訪問的鍵值對的執行緒安全集合。管理類裡面還定義了4個方法,增加刪除workthread,開始結束workthread。具體看下面的**。

public

class

workmanager

}public

void

addwork(workthread workthread)

public

void removework(string

workthreadid)

public

void

startwork()

else

}thread.sleep(

5000

); }

};action.begininvoke(cb => action.endinvoke(cb), null

); }

public

void

endwork()

;action.begininvoke(cb => action.endinvoke(cb), null

); }

}

**是不是很簡單,到這裡位置,工作管理的核心**全部上完了,那我們該怎麼呼叫了,看看下面呼叫**。

console.title = "

工作管理器";

workmanager manager = new

workmanager();

manager.addwork(

new testa(1

, worktype.allwork));

manager.addwork(

new testb(1

, worktype.allwork));

manager.startwork();

console.writeline(

"1.全部開始工作");

thread.sleep(

15 * 1000

); manager.endwork();

console.writeline(

"2.全部解除安裝");

thread.sleep(

10 * 1000

); manager.addwork(

new testb(1

, worktype.allwork));

console.writeline(

"3.加入b");

console.read();

看一下執行效果圖:

乙個簡單的ThreadPool分析

專案是多執行緒的,所以引入了執行緒池這個東西。池子是個老美寫的。在專案中表現的還不錯。所以把它摘出來,介紹給以後或許需要用到它的同行們。關於為什麼要採用threadpool,原文已經提到了 建立乙個執行緒是需要開銷的 如果執行緒數量過大的話,cpu就會浪費很大的精力做執行緒切換。threadpool...

嘗試實現乙個簡單的threadpool

參考資料 c 高併發多執行緒學習 一 c 併發程式設計 part 2 標頭檔案 include include include include include include include include include using namespace std class task task vi...

對threadpool的效能測試

自己編寫的threadpool http www.oschina.net code snippet 102078 2072或者http jaff20071234.download.csdn.net 沒有正規的文件,只能自己編寫程式進行效能測試了。1。建立乙個threadmanage物件只含有10個執...