阿里代码规约:手动创建线程池,效果会更好哦

>>强大,10k+点赞的 SpringBoot 后台管理系统竟然出了详细教程!

点击关注公众号,利用碎片时间学习

来源:blog.csdn.net/loulanyue_/article/details/100166717

项目中创建多线程时,使用常见的三种线程池创建方式,单一、可变、定长都有一定问题,原因是FixedThreadPoolSingleThreadExecutor底层都是用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个参数

  • corePoolSize线程池的核心线程数
  • maximumPoolSize能容纳的最大线程数
  • keepAliveTime空闲线程存活时间
  • unit 存活的时间单位
  • workQueue 存放提交但未执行任务的队列
  • threadFactory 创建线程的工厂类
  • 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);

推荐:

主流Java进阶技术(学习资料分享)

阿里代码规约:手动创建线程池,效果会更好哦
PS:因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。“在看”支持我们吧!

原文始发于微信公众号(Java笔记虾):阿里代码规约:手动创建线程池,效果会更好哦