面试官:线程池的构建方法和拒绝策略有哪些?
在 Java 中,线程池是一种用于管理线程的强大工具,可提高性能并减少资源消耗。本文将介绍线程池的构建方法、线程池的类型以及线程池的拒绝策略。
构建线程池的方法
Java
中的线程池主要通过java.util.concurrent.ExecutorService
接口及其实现类ThreadPoolExecutor
进行构建。以下是常见的几种构建方法:
-
使用
Executors
类的工厂方法:Executors
类提供了一系列用于创建线程池的静态工厂方法,例如newFixedThreadPool
、newCachedThreadPool
和newSingleThreadExecutor
。 -
直接创建
ThreadPoolExecutor
实例:可以直接实例化ThreadPoolExecutor
类并传入一系列参数来创建线程池,例如核心线程数、最大线程数、空闲线程存活时间、时间单位、任务队列等。
线程池的类型
Java
中的线程池可以分为以下几种:
-
固定线程池(
FixedThreadPool
):固定线程池具有固定数量的核心线程,且最大线程数与核心线程数相同。这种线程池适用于处理固定数量的并发任务。 -
可缓存线程池(
CachedThreadPool
):可缓存线程池的核心线程数为 0,最大线程数为Integer.MAX_VALUE。当有新任务到来时,若有空闲线程则复用,若无则创建新线程。空闲线程在一定时间后会被回收。这种线程池适用于执行大量短时间任务的场景。 -
单线程执行器(
SingleThreadExecutor
):单线程执行器只有一个核心线程,最大线程数也为 1。任务会按照顺序执行,适用于需要串行执行任务的场景。 -
定时线程池(
ScheduledThreadPool
):定时线程池允许定时执行任务或者周期性执行任务。它继承自ThreadPoolExecutor
,且实现了ScheduledExecutorService
接口。
线程池的拒绝策略
线程池的拒绝策略当线程池中的线程达到最大线程数且任务队列已满时,线程池会采用拒绝策略来处理新到来的任务。Java
中的有以下几种:
-
AbortPolicy
(默认拒绝策略):直接抛出RejectedExecutionException异常,表示任务无法处理。 -
CallerRunsPolicy
:调用任务的提交者所在的线程来执行任务。这种策略可以降低新任务提交的速度,从而为线程池腾出时间处理已提交的任务。 -
DiscardPolicy
:该策略直接丢弃新到来的任务,不抛出异常。如果你可以容忍某些任务不被执行,这种策略可能会很有用。 -
DiscardOldestPolicy
:该策略会丢弃任务队列中等待时间最长的任务,然后尝试提交新任务。这种策略在任务队列可能存在低优先级任务时较为实用。 -
自定义拒绝策略:你还可以实现
RejectedExecutionHandler
接口来自定义拒绝策略。例如,可以记录被拒绝的任务,以便稍后分析和处理。
总结
线程池在 Java
中是一个强大的工具,可以帮助我们管理和控制线程的执行。了解不同类型的线程池及其适用场景以及拒绝策略可以帮助我们更有效地使用线程池。在实际应用中,我们应根据需求选择合适的线程池类型和拒绝策略,以实现高效、稳定的并发执行。
转载自:https://juejin.cn/post/7215424831209635901