一步步瞭解執行緒池之基本執行緒池-ThreadPoolExecutor

NiceToMeetYou發表於2019-04-28

ThreadPoolExecutor構造方法

public ThreadPoolExecutor(
    int corePoolSize, //核心執行緒數量
    int maxminPoolSize, //執行緒池中最大執行緒數量
    long keepAliveTime, //非核心執行緒空閒時等待下一任務到來的時間.
    //////////////////////當任務的執行時間短的時候,調大該值有助於執行緒的利用率。
    //////////////////////當allowCoreThreadTimeOut屬性設定為true時,該屬性也可用於核心執行緒。
    TImeUnit unit, //keepAliveTime時間屬性的單位
    BlockingQueue<Runnable> workQueue, //任務佇列
    ThreadFactory threadFactory //執行緒工廠,可用於設定執行緒名字等,一般無需設定該引數
    ) {}
複製程式碼

使用案例:

val pool = ThreadPoolExecutor(3, 5, 1, 
            TimeUnit.SECONDS, LinkedBlockingQueue<Runnable>(100))

複製程式碼
txt.click {
    for (i in 0 until 30) {
        val runnable = Runnable {
            try {
                Thread.sleep(2000)
                log("當前執行緒是:", Thread.currentThread.name)
            }catch(e: Exception) {
                e.printStackTrace()
            }
        }
        pool.execute(runnable)
    }
}
複製程式碼
  • execute一個執行緒之後,如果未達到核心執行緒數,則會啟用一個核心執行緒去執行。
  • execute一個執行緒之後,如果已達核心執行緒數,且workQueue未滿,則將新執行緒放入workQueue中等待執行。
  • execute一個執行緒之後,如果已達核心執行緒數,但未超過非核心執行緒數,且workQueue已滿,則開啟一個非核心執行緒數來執行任務。
  • execute一個執行緒之後,如果已超非核心執行緒數,則拒絕該任務,採取飽和策略並丟擲RejectedExecutionException異常。

總結: 當任務進來時

如果核心執行緒數未滿,則開啟核心執行緒數; 如果核心執行緒數滿了,則放入workQueue中等待; 如果核心執行緒數滿了,workQueue也滿了,則開啟一個非核心執行緒數; 如果核心執行緒,workQueue,非核心執行緒都滿了,則丟擲異常;

使用級別: 核心執行緒 > workQueue > 非核心執行緒

相關文章