线程池
线程池使用
- 最常用直接通过Executors工具快速床架,不需要手动配置参数,但是不推荐,阿里巴巴开发手册规定了不能使用Executors直接创建,有可能大量创建线程导致OOM
- 手动创建的ThreadPoolExecutor需要指定7个核心参数
线程池参数
-

-
线程核心数(长期维持的最小线程数),最大线程数,空闲线程存活时间,存活时间单位,任务阻塞队列(线程忙的时候,新任务就存储在这个地方),线程创建工厂(设置线程名以及优先级),拒绝策略(队列满且线程达到最大数),然后提交任务可以使用execute或者submit(能提交callable有返回值),使用shutdown()关闭线程池
拒绝策略
- 有四种:直接抛异常,让提交任务的主线程自己执行,直接丢弃新任务,直接丢弃队列里面最早被方进去的任务,再提交新的任务
工作流程
- 任务提交,线程池是否在运行,线程数是否小于核心数,小于的话增加线程,如果不小于看这个阻塞队列是否已满,如果没满添加到队列里,如果满了检查是否小于最大线程数,如果小于添加线程,如果满了执行拒绝策略
线程池的种类
- 阿里规范:禁止使用 Executors 创建下面这四个线程池,因为高并发场景下,队列无界以及最大线程数无线很容易 OOM,建议使用手动创建 ThreadPoolExecutor
- ScheduledThreadPool:可以设置定期的执行任务,自定义核心线程,无上限最大线程
- FixedThreadPool:他的核心线程数和最大线程数是一样的,不会进行空闲回收,队列无界,适合处理任务量可控场景,不适合大量耗时的阻塞任务,会让队列OOM
- CachedThreadPool:缓存线程池,特点是线程数几乎可以无限增加,线程闲置的时候 60s可以自动回收,线程数量不固定
- SingleThreadExecutor:使用唯一的线程去执行任务,但是线程数只有一个,串行执行,保证任务按照顺序依次跑
设置守护线程
要自己定义线程创建工厂,设置线程名以及守护线程为 true.
// ✅ 手动创建线程池
ThreadPoolExecutor executor = new ThreadPoolExecutor(
parallelism, // 核心线程数 = 并行度
parallelism, // 最大线程数 = 核心数(固定大小)
0L, // 非核心线程立即回收(因为core=max)
TimeUnit.SECONDS,
new LinkedBlockingQueue<>(parallelism * 2), // 有界队列,容量为并行度的2倍
r -> {
Thread thread = new Thread(r, "paicli-tool-executor");
thread.setDaemon(true);
return thread;
},
new ThreadPoolExecutor.CallerRunsPolicy() // 队列满时由调用线程执行(背压)
);

浙公网安备 33010602011771号