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