執行緒池(一) 實現乙個簡單的執行緒池

2021-09-27 11:16:07 字數 2083 閱讀 9380

我們知道頻繁的建立、銷毀執行緒是不可取的,為了減少建立和銷毀執行緒的次數,讓每個執行緒可以多次使用,我們就可以使用執行緒池,可以降低資源到的消耗。

執行緒池裡面肯定有多個執行緒,那麼我們就簡單的用乙個陣列來儲存執行緒,那我們我們預設裡面有 5 個執行緒。那我們執行緒池裡只有五個執行緒能同時工作,那同時有 20 個任務來請求怎麼辦呢?

這時我們就想到了我們 堵塞佇列(一)—— 常用的堵塞佇列 中介紹的常用的堵塞佇列。我們可以用堵塞佇列來儲存我們的請求,當執行緒完成了當前任務,再去堵塞佇列中取任務進行執行。

其中 workthread 我們可以使用內部類進行實現,它的主要任務就是不斷的從堵塞佇列中取任務進行執行。當堵塞隊列為空時,阻塞在下圖箭頭處。

另外我們沒有使用 while(true) 死迴圈,而是使用了 isinterrupted() 方法,然後我們也提供了 stopwork() 方法以供可以中斷我們的執行緒。特別注意的是,在異常中我們要再次進行中斷訊號的設定,否則異常會將中斷訊號復原,執行緒將無法中斷。

然後就是我們的構造方法了,我們可以使用預設的設定,也可以進行自己的設定,在呼叫構造方法初始化的時候,我們就建立乙個堵塞佇列,以及執行緒陣列中的執行緒,並啟動了其執行緒,用於等待任務進行執行。

我們的執行緒池,現在就剩下建立任務和銷毀了,執行任務其實就是把任務 put 進堵塞佇列即可,因為我們的工作執行緒一直堵塞在佇列的 take 方法處,主要我們將任務 put 入佇列中,工作執行緒就會自動執行。

至於銷毀執行緒池,我們只要將所有工作執行緒發出中斷訊號,使其中斷,並清除堵塞佇列中的未執行的任務即可。

上述我們分析了整個執行緒池實現的思想,其完整如下

public

class

mythreadpool

public

mythreadpool

(int worknum,

int taskcount)

}//執行任務

public

void

execute

(runnable runnable)

catch

(interruptedexception e)

}//銷毀執行緒池

public

void

destroy()

taskqueue.

clear()

;}/** * 內部類,工作執行緒

*/private

class

workthread

extends

thread

runnable = null;

// help gc

}catch

(interruptedexception e)}}

public

void

stopwork()

}}

現在我們直接進行測試,測試**非常簡單,就是我們制定了執行緒池中有 3 個執行緒在工作,堵塞佇列預設 100 個,然後我們讓 5 個請求去訪問它,每個執行緒隨機修改 0~5 秒。在 10 秒後銷毀執行緒池。

public

class

static

class

mytask

implements

runnable

catch

(interruptedexception e)}}

}

執行結果如下:

注意:這個異常並不是程式有誤,而是我們的工程執行緒堵塞在 take() 佇列中的請求時,我們銷毀執行緒池時,向其發出了中斷訊號,所以丟擲了異常,然後會在 while 迴圈上再次判斷其中斷訊號,不滿足工作執行緒停止。

乙個簡單的執行緒池實現

乙個linux下簡單的執行緒池實現 實現了大部分邏輯,有部分邏輯未實現,只是提供乙個思路 執行緒池類 threadpool.h created on oct 13,2016 author luokun ifndef threadpool h define threadpool h include i...

實現乙個執行緒池

一.執行緒最主要的三個同步機制 1.訊號量 2.互斥鎖 3.條件變數 二.對三個同步機制分別實現乙個包裝類 ifdef locker h define locker h include include 訊號量的封裝 class sem sem bool wait bool post private ...

乙個簡單的執行緒池

話說這個執行緒池也寫了好久了 做簡單的東西的時候也在用,最近因為乙個失誤刪掉了自己的一些檔案導致重新寫了一遍 所以貼出來,以防萬一 並且跟大佬們交流 created by cxhmyself on 18 4 10.include 都需要與互斥量一起才能工作 include include inclu...