當前位置:編程學習大全網 - 源碼下載 - 線程池執行服務

線程池執行服務

並發,啟動大量任務線程時,頻繁的線程創建/銷毀會造成浪費。(創建、運行、銷毀都需要時間),采用線程池和線程復用技術提高性能。

線程池實現類,ThreadPoolExecutor類。

ThreadPoolExecutor構造方法,實現不同類型的線程池。

CorePoolSize,核心線程的數量。

MaximumPoolSize(允許的最大線程數)超過了報告的異常。

KeepAliveTime,非核心線程活動時間。

時間單位,時間測量。

BlockingQueue & ltRunnable & gt,任務隊列,(無限,有限隊列,堆棧)。

線程工廠,線程工廠

不建議使用ThreadPoolExecutor構造函數直接創建。

1,緩存

核心線程為0,最大線程為MAX_VALUE,任務隊列為流水線,線程活動60秒無存儲。

適合短期和大型任務。

當某段時間內有高並發任務時,會產生大量線程。任務結束後,線程變為空閑,在60秒內重用,並處理新的任務。當空閑時間達到60秒時,它們被銷毀。

2、固定數量

核心線程,最大線程,用戶定義,LinkedBlockingQueue任務隊列,無空閑時間,無限隊列。

適合長期任務場景。

任務隊列是無界的,只有核心線程工作,不需要設置keepAlieveTime。

3、單線程

核心線程,最大線程,數量1,LinkedBlockingQueue任務隊列,無空閑時間,無界隊列。

適用於單任務順序執行場景。

只有壹個核心線程,新任務加入隊列。

4、定時任務

ScheduledThreadPoolExecutor實例,ThreadPoolExecutor子類。

核心線程定制,最大線程MAX_VALUE,DelayedWorkQueue任務隊列,空閑時間10s。

適用於指定延遲任務或周期性任務方案。

隊列不是按提交時間排序,而是按延遲時間升序排序。具有短延遲時間和高優先級的隊列將首先被執行。

線程池ThreadPoolExecutor被創建,任務被分發到線程池,線程執行由execute()方法自動分配。

方法判斷工作線程的數量,當

當> =核心線程時,運行(c)方法,這意味著c

Offer()是非阻塞方法。如果隊列已滿,則返回失敗。此時addWorker()方法創建壹個線程,不設置flag參數代表非核心線程,任務將由新創建的非核心線程處理。

新線程創建

如果工作線程>:CAPACITY capacity,或者>;=允許的最大值(創建核心線程>;=核心線程數),並返回失敗。

創建壹個Runnable類型的Worker對象,ThreadPoolExecutor的內部靜態類,用戶任務封裝,newThread()方法,創建壹個新線程,將Worker(this)作為新線程的任務主體。

將worker任務添加到HashSet集合中,設置WorkerAdded標誌,啟動壹個新線程(start方法),設置workerStarted start標誌表示線程啟動,執行Worker任務的run()方法,調用runWorker()方法(外部類方法)。

新線程執行Worker任務的run()方法,在Worker的幫助下開始為線程池工作,從Worker獲取內部Runnable(即execute調度的用戶任務),執行run()方法。

當用戶的任務被處理時,線程不會立即結束。while循環,繼續從任務隊列中獲取任務,可能會導致阻塞,如果隊列為空,線程就會結束。

BlockingQueue阻塞隊列。

1,工作線程wc >核心線程

設置timed標誌,queue采用阻塞等待(poll+timeout模式),timeout設置線程keepAliveTime。

因此,即使隊列中沒有任務,線程仍然存活(任務進入隊列後可以被喚醒立即開始工作)。

2、工作線程WC

(僅限核心線程),隊列總是阻塞的(take模式),當隊列為空時,線程總是阻塞的,核心線程不會結束。

3.隊列為空,輪詢已超時。

設置超時超時標誌,在下壹個周期,如果工作線程WC >;核心線程(timed和timedOut標誌共存),線程數減少,退出則返回null,線程結束。

4.設置核心線程allowCoreThreadTimeOut

不考慮工作線程wc,采用poll+timeout模式,keepAliveTime隊列沒有任務,所有線程都會超時,下壹個周期自動結束。

即使WC

線程池的本質是設置壹定數量的線程集,任務結束,線程不結束。根據設定值,請求任務隊列,繼續任務,重用線程。

線程等待,利用任務隊列的阻塞特性。阻塞任務隊列,訪問空隊列時,線程等待,超時過期,線程保持活動或保持活動。

任務排隊

Poll()方法,取隊列,非阻塞,poll+timeout,阻塞超時時間。

Take()方法,取隊列和塊等待。

關鍵詞put()方法,保存隊列,阻塞等待,

Offer()方法,保存隊列,非阻塞,offer+超時,阻塞超時時間。

線程集中未指定核心線程。如果所有線程都是空閑的,隊列是空的,那麽它們在getTask()方法中按照超時的情況壹個壹個的醒來結束,剩下的數= core,它們就是core。

責任重大

  • 上一篇:Redisson實現分布式鎖原理
  • 下一篇:南寧至昆明最簡便路線
  • copyright 2024編程學習大全網