📄️ 线程池有哪些应用场景?
线程池是一种基于池化思想管理线程的工具,使用线程池可以减少创建销毁线程的开销,避免线程过多导致系统资源耗尽。充分利用池内计算资源,等待分配并发执行任务,提高系统性能和响应能力。在业务系统开发过程中,线程池有两个常见的应用场景,分别是:快速响应用户请求和快速处理批量任务。
📄️ 了解线程池的工作原理吗?
线程池通常指 JDK 中 Executor 接口中最通用也是最常用的实现类 ThreadPoolExecutor,它基于生产者与消费者模型实现,从功能上可以分为三个部分:线程池本体、工作队列、工作线程。
📄️ 项目重启或宕机时线程池任务还没处理完?
如果项目运行过程中,线程池中有大量的线程正在运行任务或者阻塞队列中存在大量的任务堆积,此时项目遇到重启或者宕机的情况,线程池会丢失运行中以及未运行的任务,导致业务异常。针对这种场景,有两种解决方案:优雅关闭线程池、消息队列保障任务不丢失。
📄️ 线程池如何实现线程复用和回收?
线程复用就是让线程在一个 while 循环中,反复调用 getTask 方法从阻塞队列中获取新的任务并执行。如果从阻塞队列获取任务超时则进行超时回收逻辑。
📄️ 如何监控线程池的运行性能指标?
绝大多数的项目其实都运行在大大小小的线程池中,如果我们不对线程池的运行状态进行监控,那么就不能及时的发现问题的苗头,而只能等到问题真正发生的时候再进行补救。比如常见的线程池被打满的问题,如果能及时发现线程池消费速率不足,任务积压严重,那么就可以尽早处理避免。
📄️ 如何感知线程池触发了拒绝策略?
在高并发、高吞吐量的极限情况下,平常稳定运行的线程池可能会变得不稳定,作为线程池任务执行策略中兜底的拒绝策略显得格外重要。我们可以通过静态代理和动态代理方式感知线程池拒绝策略并做出相应处理。
📄️ 为什么不建议Executors创建线程池?
Executors 是 Java 提供的一个工具类,位于 java.util.concurrent 包中,用于创建和管理线程池。它提供了一些静态方法来便捷地创建不同类型的线程池。然而,Executors 创建的线程池在默认配置下可能并不适用于所有场景,这里我们说下每个方法创建的线程池都有哪些弊端。
📄️ 如何处理线程池任务运行异常?
当线程池通过 execute 方法提交任务运行时,如果在执行过程中抛出异常,这个异常不会传播到提交任务的线程,而是由线程池处理。根据线程池默认机制,会将该线程销毁。