多線程任務(wù)隊列實現(xiàn)

背景

我們在應(yīng)用程序中, 要完成一些異步工作颠通, 同時在異步工作中又要盡量少用switch case, 這時task任務(wù)繼承方式就可以達到效果谨垃。我們可以在作業(yè)隊列中分配或添加任務(wù)硼控,然后作業(yè)隊列負(fù)責(zé)完成任務(wù)。這里的工作隊列可以是多線程的牢撼,也可以是單線程的。本文采用的是多線程的實現(xiàn)浪默,單線程的可以留言給我。

組成部分

設(shè)計一個多線程就可以參照線程池的框架碰逸, 它要包含幾個部分:
a. 線程池管理器:用于創(chuàng)建并管理線程池
b. 工作線程: 線程池中實際執(zhí)行的線程
c. 任務(wù)接口:將任務(wù)抽象出來阔加,形成任務(wù)接口,從而可以通過繼承來實現(xiàn)自己要做的事
d. 任務(wù)隊列:這里是通過個queue來保存胜榔。

設(shè)計要求

本文完成的工作隊列是以跨平臺為前提, 可以在多個平臺上運行吭露。并具有以下一些特點:
a. 作業(yè)隊列是可以單線程也可以多線程
b. 作業(yè)隊列有優(yōu)先級尊惰,具有高優(yōu)先級的作業(yè)將在隊列中具有較低優(yōu)先級的作業(yè)之前添加泥兰。因此题禀,它們將在其他較低優(yōu)先級作業(yè)之前處理鞋诗。
c. 作業(yè)隊列可以暫停迈嘹,因此暫停時不能處理新作業(yè)。但是用戶仍然可以將作業(yè)添加到隊列中吃警。一旦用戶選擇恢復(fù)作業(yè)隊列啄育,作業(yè)將被處理。

類設(shè)計

我們實現(xiàn)的通用線程池框架由五個重要部分組成ZLThread挑豌,ZLWorkerThread,ZLThreadManager侯勉,ZLThreadPool,ZLTask址貌,除此之外框架中還包括線程同步使用的類ZLMutex和ZLCondition徘键,其中重要部分的大體聯(lián)系如下圖:

Paste_Image.png

a. ZLTask是所有的任務(wù)的基類,其提供一個接口DoTaskProc螟凭,所有的任務(wù)類都必須從該類繼承它呀,同時實現(xiàn)DoTaskProc方法螺男。該方法中實現(xiàn)具體的任務(wù)邏輯纵穿。
b. ZLThread是線程的類抽象,其封裝了各個系統(tǒng)線程最經(jīng)常使用的屬性和方法淆院,是所有線程類的基類篙耗,具有一個接口Run。
c. ZLWorkerThread是實際被調(diào)度和執(zhí)行的線程類宗弯,其從ZLThread繼承而來,實現(xiàn)了ZLThread中的Run方法蒙保。
d. ZLThreadPool是線程池類,其負(fù)責(zé)保存線程逝嚎,釋放線程以及調(diào)度線程详恼。
e. ZLThreadManager是線程池與用戶的直接接口,其屏蔽了內(nèi)部的具體實現(xiàn)昧互。
f. ZLMutex用于線程之間的互斥。
g. ZLCondition則是條件變量的封裝叽掘,用于線程之間的同步玖雁。

流程

把線程與task任務(wù)進行統(tǒng)一管理,創(chuàng)建有限的線程數(shù)來處理task任務(wù)赫冬,如下圖:

Paste_Image.png

從圖上可以看出主要含有三個隊列,任務(wù)隊列竖哩,工作線程隊列脊僚,忙碌線程隊列;任務(wù)隊列是一個阻塞隊列辽幌,任務(wù)不斷地被push進來,這里要有一個線程來取任務(wù)乌企,獲取空閑線程, 交于空閑線程去處理拳喻,如果獲取到任務(wù),則將線程會進入忙碌線程隊列中冗澈,執(zhí)行任務(wù)的DoTaskProc工作,當(dāng)工作完成彻采,重新移出工作線程隊列。

參考

http://blog.csdn.net/ithzhang/article/details/9020283

開源:https://git.coding.net/clzhan/MulitiThreadJob.git

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末肛响,一起剝皮案震驚了整個濱河市惜索,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌雹有,老刑警劉巖臼寄,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異质帅,居然都是意外死亡,警方通過查閱死者的電腦和手機煤惩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門炼邀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人洛退,你說我怎么就攤上這事”樱” “怎么了腔剂?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長袜漩。 經(jīng)常有香客問我,道長宙攻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任仇味,我火速辦了婚禮雹顺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嬉愧。我一直安慰自己喉前,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布裕便。 她就那樣靜靜地躺著见咒,像睡著了一般偿衰。 火紅的嫁衣襯著肌膚如雪改览。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天视事,我揣著相機與錄音庆揩,去河邊找鬼。 笑死订晌,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的腾仅。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼鹤耍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了喊衫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤族购,失蹤者是張志新(化名)和其女友劉穎陵珍,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體互纯,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡留潦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了殖卑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡孵稽,死狀恐怖屹堰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情扯键,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布馅笙,位于F島的核電站厉亏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏爱只。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一窝趣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧哑舒,春花似錦、人聲如沸洗鸵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吏祸。三九已至对蒲,卻和暖如春贡翘,著一層夾襖步出監(jiān)牢的瞬間砰逻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工踊东, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留刚操,地道東北人闸翅。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓菊霜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親记某。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容