1. 程式人生 > 實用技巧 >celery定時任務+redis有序集合實現實時訪問人數

celery定時任務+redis有序集合實現實時訪問人數

JAVA執行緒池的好處

02

執行緒池的實現原理

當向執行緒池中提交一個任務時,執行緒池會首先判斷執行緒池中的核心執行緒是否已滿。如果沒滿,就建立一個核心執行緒執行任務,如果執行緒池核心執行緒數已滿;則執行緒池會繼續判斷工作佇列是否已經滿了,如果佇列沒滿,就將提交的執行緒放到工作佇列中,如果佇列已滿,就判斷執行緒池中的最大執行緒數是否滿了,不滿則建立一個工作執行緒來執行任務(這一步需要獲取全域性鎖),如果已經滿了就提交到配置的飽和策略來處理這個任務

03

執行緒池的引數

首先,先看看執行緒池中各個引數的含義,上圖顯示執行緒池中的幾個主要的引數,corePoolSize是核心執行緒數,表示執行緒池中常駐執行緒數量,和他相似的還有一個maxPoolSize(最大執行緒池數),當程式提交的任務特別多,corePoolSize無法滿足需求的時候,就會先執行緒池中增加執行緒,以便於應對任務突增的情況,還有就是這個處理體驗除了執行緒池的好處,避免一下子建立很多的執行緒,而是視任務而言去處理。

public ThreadPoolExecutor(int corePoolSize,                          int maximumPoolSize,                          long keepAliveTime,                          TimeUnit unit,                          BlockingQueue<Runnable> workQueue,                          ThreadFactory threadFactory,                          RejectedExecutionHandler handler)
    1. corePoolSize 執行緒池的基本大小;當提交一個任務給執行緒池的時候,執行緒池會建立一個執行緒來執行這個任務,當執行緒池中的核心執行緒數到達這個數量的時候,就不再建立了,就交給後面的引數來處理

    2. maximumPoolSize 執行緒池的最大執行緒數,當執行緒池的核心執行緒數達到最大,並且任務佇列已經滿了的情況話,就會建立工作執行緒到這個數字,然後根據配置的拒絕策略來處理新提交的任務

    3. keepAliveTime+TimeUnit unit 當執行緒池中執行緒數量多於核心執行緒數時,而此時又沒有任務可做,執行緒池就會檢測執行緒的 keepAliveTime,如果超過規定的時間,無事可做的執行緒就會被銷燬,以便減少記憶體的佔用和資源消耗。如果後期任務又多了起來,執行緒池也會根據規則重新建立執行緒,所以這是一個可伸縮的過程,比較靈活,我們也可以用 setKeepAliveTime 方法動態改變 keepAliveTime 的引數值。

    4. BlockingQueue<Runnable> 任務佇列,用於儲存等待執行的任務的阻塞佇列,可以選擇以下幾種佇列

    5. ThreadFactory ThreadFactory 實際上是一個執行緒工廠,它的作用是生產執行緒以便執行任務。我們可以選擇使用預設的執行緒工廠,建立的執行緒都會在同一個執行緒組,並擁有一樣的優先順序,且都不是守護執行緒,我們也可以選擇自己定製執行緒工廠,以方便給執行緒自定義命名,不同的執行緒池內的執行緒通常會根據具體業務來定製不同的執行緒名

    6. RejectedExecutionHandler執行緒池拒絕策略