线程池的相关问题
目录
谈谈线程池的理解
-
减少创建线程和销毁线程的系统开销;
-
提高响应速度;
-
提高线程的管理型;
线程池的核心参数
线程池运行过程
![](https://img-blog.csdnimg.cn/4e283fbf2a4841df9804e15fcb335527.png)
常见线程池有哪些以及使用场景?
为什么要使用线程池?
-
减少创建线程和销毁线程所造成的系统开销;
-
提高响应速度,任务到达时,相对于手动创建一个线程,直接从线程池中拿一个线程,速度肯定会快许多;
-
提高线程的管理型,线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。
谈谈线程池的状态
RUNNING:运行状态,只要线程池一旦被创建,就会处于运行状态。
SHUTDOWN:关闭状态,停止接受新的线程任务,但是会继续执行正在执行的任务和工作队列中的任务。
STOP:停止状态,停止接受新的任务,也不会继续执行工作队列里的任务,正在运行的任务会被中断。
TIDYING:整理状态,表示线程池中所有的任务都终止执行。
TERMINATED:表示线程池彻底终止。
线程池的四种拒绝策略
AbortPolicy:默认策略,丢弃任务并抛出RejectedExecutionException异常;
DiscardPolicy:丢弃任务,但不抛异常;
DiscardOldestPolicy:丢弃队列中的末尾任务(最早进入队列的任务),继续将当前任务提交给线程池;
CallerRunsPolicy:交给调用线程池的线程进行处理(谁调用,谁处理);
线程池有哪几种工作队列?
ArrayBlockingQueue(有界队列):基于数组实现,按照FIFO的方式进行排序;
LinkedBlockingQueue(可设置容量队列):基于链表实现,按照FIFO的方式进行排序,可以选择设置容量,如果不设置的话,最大长度为Integer.MAX_VALUE,可视为无界队列;FixedThreadPool
、SingleThreadExecutor
线程池使用LinkedBlockingQueue
队列;
DelayedWorkQueue(延迟队列):是基于堆结构的延迟队列,基于数组实现,该队列根据指定的延迟时间从小到大排序,如果延迟时间相同,则根据插入到队列的先后排序。ScheduledThreadPool
线程池使用了这个队列。
PriorityBlockingQueue(优先级队列):是一个基于优先级的无界队列(优先级的判断通过构造函数传入的Compator
或元素实现Comparable
接口来决定)。
SynchronousQueue(同步队列):不存储元素的阻塞队列(内部没有保存元素的数据结构容器),每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态。CachedThreadPool
线程池使用这个队列。