1. 程式人生 > >017.多執行緒-執行緒池原理解析以及合理配置

017.多執行緒-執行緒池原理解析以及合理配置

    public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
RejectedExecutionHandler handler);
  • corePoolSize: 核心池的大小。 當有任務來之後,就會建立一個執行緒去執行任務,當執行緒池中的執行緒數目達到corePoolSize後,就會把到達的任務放到快取隊列當中
  • maximumPoolSize: 執行緒池最大執行緒數,它表示線上程池中最多能建立多少個執行緒;
  • keepAliveTime: 表示執行緒沒有任務執行時最多保持多久時間會終止。
  • unit: 引數keepAliveTime的時間單位,有7種取值,在TimeUnit類中有7種靜態屬性。
  • workQueue:一個阻塞佇列,提交的任務將會被放到這個佇列裡。
  • threadFactory:執行緒工廠,用來建立執行緒,主要是為了給執行緒起名字,預設工廠的執行緒名字:pool-1-thread-3。
  • handler:拒絕策略,當執行緒池裡執行緒被耗盡,且佇列也滿了的時候會呼叫。


原理分析


  • 1、判斷執行緒池裡的核心執行緒是否都在執行任務,如果不是(核心執行緒空閒或者還有核心執行緒沒有被建立)則建立一個新的工作執行緒來執行任務。如果核心執行緒都在執行任務,則進入下個流程
  • 2、執行緒池判斷工作佇列是否已滿,如果工作佇列沒有滿,則將新提交的任務儲存在這個工作佇列裡。如果工作佇列滿了,則進入下個流程。
  • 3、判斷執行緒池裡的執行緒是否都處於工作狀態,如果沒有,則建立一個新的工作執行緒來執行任務。如果已經滿了,則交給飽和策略來處理這個任務。

合理配置

任務的性質

  • CPU密集型任務
    • CPU密集型任務配置儘可能少的執行緒數量,如配置Ncpu+1個執行緒的執行緒池。
  • IO密集型任務
    • IO密集型任務則由於需要等待IO操作,執行緒並不是一直在執行任務,則配置儘可能多的執行緒,如2*Ncpu。
  • 混合型任務
    • 如果可以拆分,則將其拆分成一個CPU密集型任務和一個IO密集型任務。
    • 只要這兩個任務執行的時間相差不是太大,那麼分解後執行的吞吐率要高於序列執行的吞吐率。
    • 如果這兩個任務執行時間相差太大,則沒必要進行分解。