ThreadPoolExecutor運轉機制
阿新 • • 發佈:2017-06-18
阻塞 locking 好處 block 機制 超過 意義 異常 keepal
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
具體流程如下:
1)當池子大小小於corePoolSize就新建線程,並處理請求
2)當池子大小等於corePoolSize,把請求放入workQueue中,池子裏的空閑線程就去從workQueue中取任務並處理
3)當workQueue放不下新入的任務時,新建線程入池,並處理請求,如果池子大小撐到了maximumPoolSize就用RejectedExecutionHandler來做拒絕處理
4)另外,當池子的線程數大於corePoolSize的時候,多余的線程會等待keepAliveTime長的時間,如果無請求可處理就自行銷毀
1、BlockingQueue 只是一個接口,常用的實現類有 LinkedBlockingQueue 和 ArrayBlockingQueue。用 LinkedBlockingQueue 的好處在於沒有大小限制。這樣的話,因為隊列不會滿,所以 execute() 不會拋出異常,而線程池中運行的線程數也永遠不會超過 corePoolSize 個,keepAliveTime 參數也就沒有意義了。
2、shutdown() 方法不會阻塞。調用 shutdown() 方法之後,主線程就馬上結束了,而線程池會繼續運行直到所有任務執行完才會停止。如果不調用 shutdown() 方法,那麽線程池會一直保持下去,以便隨時添加新的任務。
ThreadPoolExecutor運轉機制