1. 程式人生 > >執行緒池的四種實現方式

執行緒池的四種實現方式

ExecutorService是執行緒池介面。它定義了4中執行緒池:

1.newCachedThreadPool

  • 底層:返回ThreadPoolExecutor例項,corePoolSize0maximumPoolSizeInteger.MAX_VALUEkeepAliveTime60LunitTimeUnit.SECONDSworkQueueSynchronousQueue(同步佇列)
  • 通俗:當有新任務到來,則插入到SynchronousQueue中,由於SynchronousQueue是同步佇列,因此會在池中尋找可用執行緒來執行,若有可以執行緒則執行,若沒有可用執行緒則建立一個執行緒來執行該任務;若池中執行緒空閒時間超過指定大小,則該執行緒會被銷燬。
  • 適用:執行很多短期非同步的小程式或者負載較輕的伺服器

2.newFixedThreadPool

  • 底層:返回ThreadPoolExecutor例項,接收引數為所設定執行緒數量nThreadcorePoolSizenThreadmaximumPoolSizenThreadkeepAliveTime0L(不限時)unit為:TimeUnit.MILLISECONDSWorkQueue為:new LinkedBlockingQueue<Runnable>() 阻塞佇列
  • 通俗:建立可容納固定數量執行緒的池子,每隔執行緒的存活時間是無限的,當池子滿了就不在新增執行緒了;如果池中的所有執行緒均在繁忙狀態,對於新任務會進入阻塞佇列中
    (無界的阻塞佇列),但是,線上程池空閒時,即執行緒池中沒有可執行任務時,它不會釋放工作執行緒,還會佔用一定的系統資源。
  • 適用:執行長期的任務,效能好很多

3.newSingleThreadExecutor:

  • 底層:FinalizableDelegatedExecutorService包裝的ThreadPoolExecutor例項,corePoolSize1maximumPoolSize1keepAliveTime0Lunit為:TimeUnit.MILLISECONDSworkQueue為:new LinkedBlockingQueue<Runnable>() 無界阻塞佇列
  • 通俗:建立只有一個執行緒的執行緒池,且執行緒的存活時間是無限的;當該執行緒正繁忙時,對於新任務會進入阻塞佇列中
    (無界的阻塞佇列)
  • 適用:一個任務一個任務執行的場景

4.NewScheduledThreadPool:

  • 底層:建立ScheduledThreadPoolExecutor例項,corePoolSize為傳遞來的引數,maximumPoolSizeInteger.MAX_VALUEkeepAliveTime0unit為:TimeUnit.NANOSECONDSworkQueue為:new DelayedWorkQueue() 一個按超時時間升序排序的佇列
  • 通俗:建立一個固定大小的執行緒池,執行緒池內執行緒存活時間無限制,執行緒池可以支援定時及週期性任務執行,如果所有執行緒均處於繁忙狀態,對於新任務會進入DelayedWorkQueue佇列中,這是一種按照超時時間排序的佇列結構
  • 適用:週期性執行任務的場景