併發7 執行緒池

2022-08-19 21:42:08 字數 3255 閱讀 5794

用優雅的方式理解和使用執行緒池

執行緒池的目的

(1)減少系統維護執行緒的開銷

(2)解耦,執行和建立分開

(3)執行緒可以復用

執行緒池的使用

(1)介面executor  提供方法execute(runnable)執行執行緒命令

(2)介面executorservice 提供方法shutdown()  啟動一次順序關閉,執行以前提交的任務,但不接受新任務

future(框架):交給我乙個任務,我給你乙個發票,到時候用發票取結果。

executors

此包中所定義的executorexecutorservicescheduledexecutorservicethreadfactorycallable類的工廠和實用方法。此類支援以下各種方法:

(3)執行緒池的分類

newfixedthreadpool(int nthreads)

建立乙個可重用固定執行緒數的執行緒池,以共享的無界佇列方式來執行這些執行緒。

建立乙個可根據需要建立新執行緒的執行緒池,但是在以前構造的執行緒可用時將重用它們。(可變大小的執行緒池)

建立乙個使用單個 worker 執行緒的 executor,以無界佇列方式來執行該執行緒。

建立乙個執行緒池,它可安排在給定延遲後執行命令或者定期地執行。

(4)定義

(5)使用

執行緒池的原理

public static executorservice newcachedthreadpool()

public static executorservice newsinglethreadexecutor()

public static executorservice newfixedthreadpool(int nthreads)

public static scheduledexecutorservice newscheduledthreadpool(int corepoolsize)
鏈結

public scheduledthreadpoolexecutor(int corepoolsize)
鏈結

public threadpoolexecutor(int corepoolsize,

int maximumpoolsize,

long keepalivetime,

timeunit unit,

blockingqueueworkqueue)

核心引數

int corepoolsize 核心執行緒池的大小
int maximumpoolsize 最大執行緒數量
long keepalivetime 執行緒保持活動的時間 為什麼這裡要有保持活動時間?因為存在核心執行緒池,與執行緒池同生命週期(同生共死),非核心也就是最大執行緒數量超過核心執行緒數量的執行緒,會存在生命週期。

timeunit unit 執行緒保持活動的時間單位
blockingqueueworkqueue 任務佇列(blockingqueue:阻塞佇列)
defaulthandler 拒絕策略

執行緒池狀態:

private static final int count_bits = integer.size - 3;  執行緒數量

private static final int capacity = (1 << count_bits) - 1; 最多容量

private static final int running = -1 << count_bits;

private static final int shutdown = 0 << count_bits;

private static final int stop = 1 << count_bits;

private static final int tidying = 2 << count_bits;

private static final int terminated = 3 << count_bits;

狀態變化

execute方法

int c = ctl.get();//獲取當前執行緒池的狀態

if (workercountof(c) < corepoolsize)

if (isrunning(c) && workqueue.offer(command))

else if (!addworker(command, false)) //如果在第三步的判斷為非執行狀態,嘗試新建執行緒,如果失敗則執行拒絕策略

reject(command);

}

執行緒池的關閉

pool.shutdown();

while(!pool.isterminated())

關於鎖的整理:

併發 執行緒池

學習 1.先大綱,然後思路優先 適當的提出問題 2.合理推測 完成上述需要知識,為了熟悉執行緒池,提出一些問題 1.執行緒什麼時候建立?2.執行緒池主要做什麼?3.無任務執行處於什麼狀態?4.提交乙個任務,執行邏輯?5.執行緒池怎樣被銷毀?回答問題 1.執行緒在執行 excute方法 中,做系列判斷...

併發實踐 執行緒池

class threadpool if stop break task tasks.front tasks.pop 必須在解鎖後再呼叫 task 建立執行緒並啟動 for int i 0 i cntthread i threadpool template typename f,typename.ar...

併發程式設計 執行緒池與程序池

以時間換空間 程序池 乙個容器,這個容器限制住你開啟程序的數量,預設是os.cpu count 我的電腦是8核,所以能開啟8個,第一次肯定只能並行的處理8個任務,只要有任務完成,程序馬上就會接下乙個任務。實現 from concurrent.futures import processpoolexe...