📝 第9章测试:ThreadPoolExecutor详解

通过以下测试题检验你对ThreadPoolExecutor核心原理、参数配置、任务队列和拒绝策略的理解程度

10道题目
建议时间:15分钟
及格分数:70分
1
ThreadPoolExecutor核心参数
在ThreadPoolExecutor中,以下哪个参数用于设置线程池中始终保持的线程数量?
解析
正确答案:B
corePoolSize是核心线程数,表示线程池中始终保持的线程数量,即使这些线程处于空闲状态也不会被回收(除非设置了allowCoreThreadTimeOut为true)。
2
任务执行流程
当向ThreadPoolExecutor提交任务时,以下执行流程的顺序是什么?
解析
正确答案:A
ThreadPoolExecutor的任务执行流程:1) 首先检查当前线程数是否小于核心线程数,如果是则创建新线程;2) 如果核心线程都在忙碌,尝试将任务加入队列;3) 如果队列已满,尝试创建非核心线程;4) 如果无法创建新线程,执行拒绝策略。
3
任务队列类型
以下哪种队列类型不存储元素,而是直接在生产者和消费者之间传递任务?
解析
正确答案:C
SynchronousQueue是一个同步队列,它不存储元素。每个插入操作必须等待一个相应的移除操作,反之亦然。这种队列适用于任务处理速度快的场景。
4
拒绝策略
ThreadPoolExecutor的默认拒绝策略是什么?
解析
正确答案:B
ThreadPoolExecutor的默认拒绝策略是AbortPolicy,当线程池无法处理新任务时,会抛出RejectedExecutionException异常,阻止系统正常运行。
5
线程池参数配置
对于CPU密集型任务,线程池的核心线程数通常设置为多少比较合适?
解析
正确答案:A
对于CPU密集型任务,由于主要消耗CPU资源,线程数过多会导致频繁的上下文切换,降低性能。通常设置为CPU核数+1,多出的1个线程用于处理可能的页缺失等情况。
6
代码分析
分析以下代码,这个线程池配置有什么问题?
ThreadPoolExecutor executor = new ThreadPoolExecutor( 2, 4, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), // 无界队列 Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy() );
解析
正确答案:B
使用无界的LinkedBlockingQueue时,任务会无限制地加入队列,永远不会触发创建新线程到maximumPoolSize的逻辑。如果任务提交速度大于处理速度,队列会无限增长,最终导致内存溢出。
7
线程工厂
自定义ThreadFactory的主要作用是什么?
解析
正确答案:B
自定义ThreadFactory的主要作用是控制线程的创建过程,可以设置有意义的线程名称(便于调试)、线程优先级、是否为守护线程、未捕获异常处理器等属性。
8
监控和钩子方法
ThreadPoolExecutor提供了哪些钩子方法用于监控和扩展?
解析
正确答案:B
ThreadPoolExecutor提供了三个钩子方法:beforeExecute()在任务执行前调用,afterExecute()在任务执行后调用,terminated()在线程池终止时调用。这些方法可以用于监控、日志记录和资源清理。
9
线程池关闭
shutdown()和shutdownNow()方法的区别是什么?
解析
正确答案:B
shutdown()方法会优雅地关闭线程池,等待已提交的任务执行完成,但不接受新任务。shutdownNow()方法会立即尝试停止所有正在执行的任务,并返回等待执行的任务列表。
10
最佳实践
在生产环境中使用ThreadPoolExecutor时,以下哪个做法是不推荐的?
解析
正确答案:A
在生产环境中不推荐使用Executors工厂方法创建线程池,因为这些方法使用的是无界队列或无限大的最大线程数,可能导致内存溢出。应该手动创建ThreadPoolExecutor并合理配置参数。
0%
测试完成!
0
答对题数
0
答错题数
10
总题数