1. 关于Executors.newFixedThreadPool()的说法,哪个是正确的?
- 线程池大小会根据任务数量动态调整
- 使用LinkedBlockingQueue作为工作队列
- 空闲线程会在60秒后被回收
- 最大线程数可以超过核心线程数
2. newCachedThreadPool()最适合哪种场景?
- 长时间运行的任务
- 需要严格控制线程数量的场景
- 执行大量短期异步任务
- 需要保证任务执行顺序的场景
3. Future.get()方法的特点是什么?
- 会阻塞当前线程直到任务完成
- 立即返回结果,如果任务未完成则返回null
- 只能获取成功的结果,不能获取异常
- 不支持超时设置
4. Callable接口相比Runnable接口的优势是什么?
- 执行效率更高
- 占用内存更少
- 支持泛型参数
- 可以返回结果并抛出异常
5. CompletionService的主要作用是什么?
- 提高任务执行效率
- 按任务完成顺序获取结果
- 自动重试失败的任务
- 限制并发任务数量
6. 关于ExecutorService的关闭,正确的做法是?
- 直接调用shutdownNow()强制关闭
- 不需要手动关闭,JVM会自动处理
- 先调用shutdown(),再用awaitTermination()等待
- 只调用shutdown()就足够了
7. newSingleThreadExecutor()的特点是什么?
- 保证任务按提交顺序执行
- 可以并行执行多个任务
- 适合CPU密集型任务
- 线程异常后不会重新创建
8. 在生产环境中使用Executors的建议是?
- 优先使用newCachedThreadPool
- 总是使用newFixedThreadPool
- Executors提供的线程池都很安全
- 建议手动配置ThreadPoolExecutor