手動創建線程池,效果會更好哦

項目中創建多線程時,使用常見的三種線程池創建方式,單一、可變、定長都有一定問題,原因是FixedThreadPool和SingleThreadExecutor底層都是用LinkedBlockingQueue實現的,這個隊列最大長度爲Integer.MAX_VALUE,容易導致OOM。所以實際生產一般自己通過ThreadPoolExecutor的7個參數,自定義線程池:

ExecutorService threadPool=new ThreadPoolExecutor(2,5,
                        1L,TimeUnit.SECONDS,
                        new LinkedBlockingQueue<>(3),
                        Executors.defaultThreadFactory(),
                        new ThreadPoolExecutor.AbortPolicy());
一、創建線程池的7個參數

1、corePoolSize線程池的核心線程數
2、maximumPoolSize能容納的最大線程數
3、keepAliveTime空閒線程存活時間
4、unit 存活的時間單位
5、workQueue 存放提交但未執行任務的隊列
6、threadFactory 創建線程的工廠類
7、handler 等待隊列滿後的拒絕策略

使用線程池時,阿里巴巴P3C代碼規約插件將提示:

手動創建線程池--不允許Executors.newFixedThreadPool創建線程池

在這裏插入圖片描述
線程池

static ExecutorService taskExe = Executors.newFixedThreadPool(10);
二、規避資源耗盡的風險,生產上的推薦解法:
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
//引入依賴包,創建線程池
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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章