執行緒池的四種實現方式
阿新 • • 發佈:2019-01-26
ExecutorService是執行緒池介面。它定義了4中執行緒池:
1.newCachedThreadPool:
- 底層:返回ThreadPoolExecutor例項,corePoolSize為0;maximumPoolSize為Integer.MAX_VALUE;keepAliveTime為60L;unit為TimeUnit.SECONDS;workQueue為SynchronousQueue(同步佇列)
- 通俗:當有新任務到來,則插入到SynchronousQueue中,由於SynchronousQueue是同步佇列,因此會在池中尋找可用執行緒來執行,若有可以執行緒則執行,若沒有可用執行緒則建立一個執行緒來執行該任務;若池中執行緒空閒時間超過指定大小,則該執行緒會被銷燬。
- 適用:執行很多短期非同步的小程式或者負載較輕的伺服器
2.newFixedThreadPool:
- 底層:返回ThreadPoolExecutor例項,接收引數為所設定執行緒數量nThread,corePoolSize為nThread,maximumPoolSize為nThread;keepAliveTime為0L(不限時);unit為:TimeUnit.MILLISECONDS;WorkQueue為:new LinkedBlockingQueue<Runnable>() 無界阻塞佇列
- 通俗:建立可容納固定數量執行緒的池子,每隔執行緒的存活時間是無限的,當池子滿了就不在新增執行緒了;如果池中的所有執行緒均在繁忙狀態,對於新任務會進入阻塞佇列中
- 適用:執行長期的任務,效能好很多
3.newSingleThreadExecutor:
- 底層:FinalizableDelegatedExecutorService包裝的ThreadPoolExecutor例項,corePoolSize為1;maximumPoolSize為1;keepAliveTime為0L;unit為:TimeUnit.MILLISECONDS;workQueue為:new LinkedBlockingQueue<Runnable>() 無界阻塞佇列
- 通俗:建立只有一個執行緒的執行緒池,且執行緒的存活時間是無限的;當該執行緒正繁忙時,對於新任務會進入阻塞佇列中
- 適用:一個任務一個任務執行的場景
4.NewScheduledThreadPool:
- 底層:建立ScheduledThreadPoolExecutor例項,corePoolSize為傳遞來的引數,maximumPoolSize為Integer.MAX_VALUE;keepAliveTime為0;unit為:TimeUnit.NANOSECONDS;workQueue為:new DelayedWorkQueue() 一個按超時時間升序排序的佇列
- 通俗:建立一個固定大小的執行緒池,執行緒池內執行緒存活時間無限制,執行緒池可以支援定時及週期性任務執行,如果所有執行緒均處於繁忙狀態,對於新任務會進入DelayedWorkQueue佇列中,這是一種按照超時時間排序的佇列結構
- 適用:週期性執行任務的場景