Java并发面试题, 你了解 Java 线程池的原理吗?
Java并发面试题, 你了解 Java 线程池的原理吗?
QA
Step 1
Q:: 你了解Java线程池的原理吗?
A:: Java线程池是一种管理工作线程的工具,能够在程序需要时创建一定数量的线程并进行复用,从而减少线程创建和销毁的开销。Java中的线程池主要由ThreadPoolExecutor类实现,通过构造函数传入核心线程数、最大线程数、空闲线程存活时间等参数进行配置。当任务提交到线程池时,如果当前线程数小于核心线程数,则会创建新线程执行任务;如果大于等于核心线程数但小于最大线程数,并且有空闲线程,则由空闲线程执行任务;否则,将任务放入阻塞队列中等待执行。
Step 2
Q:: Java线程池的核心参数有哪些?
A:: Java线程池的核心参数包括:1. corePoolSize(核心线程数):线程池中始终保留的线程数,即使它们处于空闲状态;2. maximumPoolSize(最大线程数):线程池中允许的最大线程数;3. keepAliveTime(空闲线程存活时间):超过核心线程数的线程在空闲时间达到该值时将被销毁;4. unit(时间单位):空闲线程存活时间的单位;5. workQueue(任务队列):用于存储等待执行任务的队列;6. threadFactory(线程工厂):用于创建新线程的工厂;7.
handler(拒绝策略):当任务队列已满且线程数已达到最大值时的处理策略。
Step 3
Q:: 什么是Java中的拒绝策略?有哪些常见的拒绝策略?
A:: 拒绝策略是当任务无法提交到线程池时的处理方式。Java中的ThreadPoolExecutor提供了四种默认的拒绝策略:1. AbortPolicy:抛出RejectedExecutionException异常;2. CallerRunsPolicy:调用执行任务的线程本身执行该任务;3. DiscardPolicy:直接丢弃任务;4.
DiscardOldestPolicy:丢弃队列中最老的任务,然后重新尝试提交当前任务。
Step 4
Q:: 如何自定义线程池的拒绝策略?
A:: 可以通过实现RejectedExecutionHandler接口来自定义拒绝策略。该接口有一个方法rejectedExecution(Runnable r, ThreadPoolExecutor executor)
,当任务被拒绝时,该方法将被调用。通过在该方法中编写自定义逻辑,可以实现各种自定义的拒绝策略,例如记录日志、进行告警、将任务转移到其他地方等。