線程池的運行機制

private ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("thread-call-runner-%d").build();
private ExecutorService taskExe = new ThreadPoolExecutor(10,20,200L,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>(),namedThreadFactory);

1.corePoolSize:核心線程數量
2.maximumPoolSize:線程不夠用時能夠創建的最大線程數
3.workQueue:任務等待隊列
4.keepAliveTime:搶佔的順序不一定,看運氣
5.threadFactory:創建新線程,Executor.defaultThreadFactory()

首先線程池它有一個核心線程數,當線程運行的時候,如果沒有設置成預啓動加載,線程數是0;
當提交一個新任務的時候,它會建立一個核心線程去執行任務,此時如果一直來任務,之前的也沒有執行完,它會一直創建核心線程;
當達到核心線程數時,如果還都在忙,那麼就會放到blockingQueue阻塞隊列;
如果阻塞隊列也放滿了,而且核心線程還在忙,那就會去建立非核心線程,如果一直創建,數量達到非核心最大的線程數,就會觸發一個拒絕策略

JDK內置了四種拒絕策略:
AbortPolicy直接拋異常
DiscarePolicy悄無聲息的丟棄任務
DiscardOldestPolicy丟棄你最早未執行的任務
CallerRunsPolicy誰調用返回誰執行,這種方式會影響新任務的提交速度
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章