我們知道頻繁的建立、銷毀執行緒是不可取的,為了減少建立和銷毀執行緒的次數,讓每個執行緒可以多次使用,我們就可以使用執行緒池,可以降低資源到的消耗。
執行緒池裡面肯定有多個執行緒,那麼我們就簡單的用乙個陣列來儲存執行緒,那我們我們預設裡面有 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...