本文已参与「新人创作礼」活动,一起开启掘金创作之路
自定义线程池(应该使用这个)
- 核心线程:2 表示两个
- 最大线程:4 核心线程满了后,最多还能扩充到4个 ,加起来一共四个
- 空闲线程存活时间:当除了核心线程外的线程空闲下来了,最多能让它空闲多久,超过这个时间就把它归还给操作系统
- 存活时间单位
- 阻塞队列:各种各样的blockingqueue都可以丢进去
- 线程工厂:通过实现ThreadFactory来自定义线程,可以指定线程的名称,方便出错时回溯,jstack排查时非常有用,提供了默认的工厂
- 拒绝策略:默认提供四种,可以自定义
-
- 线程满了后抛异常
- 线程满了后直接丢弃,不抛异常
- 丢掉等待队列中排队时间最久的
- 哪个线程提交的任务,哪个线程执行
- 自定义:实现自定义接口
通过Executors创建(不允许)
- Executors返回线程池的弊端如下
-
- FixedThreadPool和SingleThreadPool
-
-
- SingleThreadPool只有一个线程
-
-
-
-
- 单线程线程池能对线程的完整生命周期进行维护,而自己new线程不行
-
-
-
-
- 默认使用linkedBolckingqueue,允许最大的请求队列长度为Integer.MAX_VALUE,当线程执行时间比较长,核心线程一直被占有时,会造成任务大量的堆积在队列中,从而造成OOM
-
-
- CachedThreadPool
-
-
- corePoolSize为0,maximumPoolSize为无限大,意味着线程数量可以无限大;
- 采用SynchronousQueue装等待的任务,这个阻塞队列没有存储空间,这意味着只要有请求到来,就必须要找到一条工作线程处理他,如果当前没有空闲的线程,那么就会再创建一条新的线程。
- 允许创建线程的数量为Integer.MAX_VALUE,可能会创建大量线程,从而造成OOM
-
-
- ScheduledThreadPool
-
-
- maximumPoolSize为无限大,意味着线程数量可以无限大;
- 采用DelayQueue
- 允许创建线程的数量为Integer.MAX_VALUE,可能会创建大量线程,从而造成OOM
-
-
- newWorkStealingPool
-
-
- 内部创建了一个ForkJoinPool,将任务分而治之,大任务分成多个小的子任务,然后再汇总起来,提高效率
-
线程池解析
源码分析-使用newFixedThreadPool线程池导致的内存飙升问题
newFixedThreadPool线程池的核心线程数是固定的,但是它使用了近乎无界的阻塞队列当核心线程使用完以后,任务会入队到阻塞队列中,如果任务执行的时间比较长,核心线程一直被占用,会导致越来越多的任务堆积到阻塞队列中,最后导致机器的内存使用不停的飙升,造成JVM的OOM