1. 程式人生 > >多執行緒任務佇列MulitiThreadJob實現

多執行緒任務佇列MulitiThreadJob實現

一. 背景

我們在應用程式中,要完成一些非同步工作, 同時在非同步工作中又要儘量少用switch case, 這時task任務繼承方式就可以達到效果。

我們可以在作業佇列中分配或新增任務,然後作業佇列負責完成任務。這裡的工作佇列可以是多執行緒的,也可以是單執行緒的。本文采用的是多執行緒的實現,單執行緒的可以@me。開源:https://git.coding.net/clzhan/MulitiThreadJob.git

 二.多執行緒的實現方式

 1.組成部分
設計一個多執行緒就可以參照執行緒池的框架, 它要包含幾個部分:
a.執行緒池管理器:用於建立並管理執行緒池
b.工作執行緒: 執行緒池中實際執行的執行緒
c.任務介面:將任務抽象出來,形成任務介面,從而可以通過繼承來實現自己要做的事
d.任務佇列:這裡是通過個queue來儲存。

2.設計要求
本文完成的工作佇列是以跨平臺為前提, 可以在多個平臺上執行。並具有以下一些特點:
a.作業佇列是可以單執行緒也可以多執行緒
b.作業佇列有優先順序,具有高優先順序的作業將在佇列中具有較低優先順序的作業之前新增。因此,它們將在其他較低優先順序作業之前處理。
c.作業佇列可以暫停,因此暫停時不能處理新作業。但是使用者仍然可以將作業新增到佇列中。一旦使用者選擇恢復作業佇列,作業將被處理。

3.類設計
我們實現的通用執行緒池框架由五個重要部分組成ZLThread,ZLWorkerThread,ZLThreadManager,ZLThreadPool,ZLTask,除此之外框架中還包括執行緒同步使用的類ZLMutex和ZLCondition,其中重要部分的大體聯絡如下圖:



a.ZLTask是所有的任務的基類,其提供一個介面DoTaskProc,所有的任務類都必須從該類繼承,同時實現DoTaskProc方法。該方法中實現具體的任務邏輯。
b.ZLThread是執行緒的類抽象,其封裝了各個系統執行緒最經常使用的屬性和方法,是所有執行緒類的基類,具有一個介面Run。
c.ZLWorkerThread是實際被排程和執行的執行緒類,其從ZLThread繼承而來,實現了ZLThread中的Run方法。
d.ZLThreadPool是執行緒池類,其負責儲存執行緒,釋放執行緒以及排程執行緒。
e.ZLThreadManager是執行緒池與使用者的直接介面,其遮蔽了內部的具體實現。
f.ZLMutex用於執行緒之間的互斥。
g.ZLCondition則是條件變數的封裝,用於執行緒之間的同步。

4.流程
把執行緒與task任務進行統一管理,建立有限的執行緒數來處理task任務,如下圖:



從圖上可以看出主要含有三個佇列,任務佇列,工作執行緒佇列,忙碌執行緒佇列;任務佇列是一個阻塞佇列,任務不斷地被push進來,這裡要有一個執行緒來取任務,獲取空閒執行緒, 交於空閒執行緒去處理,如果獲取到任務,則將執行緒會進入忙碌執行緒佇列中,執行任務的DoTaskProc工作,當工作完成,重新移出工作執行緒佇列。

這裡參考:
http://blog.csdn.net/ithzhang/article/details/9020283