线程池之ThreadPoolExecutor使用

81 阅读1分钟

1、线程池参数

序号名称类型含义
1corePoolSizeint核心线程池大小
2maximumPoolSizeint最大线程池大小
3keepAliveTimeLong核心线程池大小
4unitTimeUnit时间单位
5workQueueBlockingQueue线程等待队列
6threadFactoryThreadFactory线程创建工厂
7handlerRejectedExecutionHandler拒绝策略

2、自定义线程池

private final ThreadPoolExecutor testSynchronizeExecutor = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors() * 2,
        Runtime.getRuntime().availableProcessors() * 10, 0, SECONDS,
        new ArrayBlockingQueue<>(500), new NamedThreadFactory("test-synchronize-", false));
        

3、结合业务使用线程池

//总数量
int newsCount = 5000;
//页大小 例如一页 20条数据
int count = Constants.PAGE_SIZE;
//线程数
int threadNum = newsCount / count + 1;
CountDownLatch countDownLatch = new CountDownLatch(threadNum);
for (int i = 1; i < threadNum + 1; i++) {
    //偏移量
        int offset = i;
        testSynchronizeExecutor.execute(() -> {
        try {
            //业务处理逻辑
            String requestUrl = SysConfigUtil.getString(SysConfigEnum.youxi_older_url);
            requestUrl = MessageFormat.format(requestUrl,offset);
            log.info("***** | 请求参数 requestUrl:{} | offset:{} ", requestUrl, offset);
           //一系列操作
        } catch (Exception e) {
            log.info("多线程执行******数据异常:{}", e.getMessage());
        } finally {
            countDownLatch.countDown();
        }
    });
}
try {
    countDownLatch.await();
} catch (InterruptedException e) {
    log.info("*******数据异常:{}", e.getMessage());
}