併發(2)--java執行緒池原理
執行緒池Execotors工具可以建立普通的執行緒池以及schedule排程任務的排程池。使用執行緒池的一個優點就是:
1、執行緒是稀缺資源,使用執行緒池可以減少建立和銷燬執行緒的次數,每個工作執行緒都可以重複使用。
2、可以根據系統的承受能力,調整執行緒池中工作執行緒的數量,防止因為消耗過多記憶體導致伺服器崩潰。
執行緒池建立的方式是:
執行緒池的核心類
java.uitl.concurrent.ThreadPoolExecutor類是執行緒池中最核心的一個類,可以來看下這個類:
從原始碼上我們看出了ThreadPoolExecutor繼承了AbstractExecutorService類,並且有四個構造方法。
可以來具體分析下構造方法中每個引數的意義:
(1) corePoolSize:核心池的大小。建立池建立時,預設情況下執行緒池是沒有執行緒池的,只有請求任務到來的時候才會建立執行緒來處理請求。但是我們可以通過呼叫prestartAllCoreThreads()或者prestartCoreThread()方法來預先建立執行緒,也就是即使沒有任務也會建立corePoolSize個或者一個的執行緒,當執行緒池的數量達到了corePoolSize的時候,此時會把到達的任務放到緩衝佇列中去。
(2) maximumPoolSize:執行緒池最大執行緒數
(3) keepAliveTime:執行緒在多久之後停止執行,這個時間是在當執行緒池中的執行緒數大於corePoolSize時,keepAliveTime才會起作用,大於那部分執行緒,空閒時間達到了keepAliveTime,就會停止,除了呼叫了呼叫了allowCoreThreadTimeOut(boolean)方法,線上程池中的執行緒數不大於corePoolSize時,keepAliveTime引數也會起作用,直到執行緒池中的執行緒數為0;
(4) unit:引數keepAliveTime的時間單位
(5) workQueue:一個阻塞佇列,用來儲存等待執行的任務
(6) threadFactory:執行緒工廠,主要用來建立執行緒
(7) handler:表示當拒絕處理任務時的策略
執行緒池的執行原理
1、判斷執行緒池裡的核心執行緒是否都在執行任務,如果不是(核心執行緒空閒或者還有核心執行緒沒有被建立)則建立一個新的工作執行緒來執行任務。如果核心執行緒都在執行任務,則進入下個流程。
2、執行緒池判斷工作佇列是否已滿,如果工作佇列沒有滿,則將新提交的任務儲存在這個工作佇列裡。如果工作佇列滿了,則進入下個流程。
3、判斷執行緒池裡的執行緒是否都處於工作狀態,如果沒有,則建立一個新的工作執行緒來執行任務。如果已經滿了,則交給飽和策略來處理這個任務。
有時間繼續~