ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Java面试被问线程池,答对这5点就够了

Java面试被问线程池,答对这5点就够了 线程池是Java并发编程的核心也是面试中几乎必问的考点。很多人能背出七大参数却说不清执行流程、拒绝策略和调优思路。其实面试官想考察的无非是这5个关键点答对了基本就能过关。第1点七大参数与执行流程线程池的核心构造参数有七个corePoolSize核心线程数、maximumPoolSize最大线程数、keepAliveTime空闲存活时间、unit时间单位、workQueue工作队列、threadFactory线程工厂、handler拒绝策略。执行流程是面试必问提交任务时若当前线程数小于核心线程数直接创建核心线程执行若核心线程已满任务进入工作队列若队列已满且线程数小于最大线程数创建非核心线程若线程数达到最大且队列也满触发拒绝策略。关键点核心线程默认不会回收除非设置allowCoreThreadTimeOut(true)。非核心线程空闲超过keepAliveTime后销毁。第2点四种拒绝策略及选择当线程池无法接收新任务时由拒绝策略处理。JDK提供四种AbortPolicy默认抛出RejectedExecutionException调用方需捕获处理适合关键业务。CallerRunsPolicy由提交任务的线程自己执行能降低提交速度形成负反馈适合不允许丢任务的场景。DiscardPolicy静默丢弃不抛异常风险高仅适合无关紧要的任务。DiscardOldestPolicy丢弃队列中最旧的任务再尝试提交可能丢失重要任务。面试加分实际项目中建议自定义拒绝策略记录日志并报警避免任务无声丢失。第3点线程池状态与关闭线程池有五种状态RUNNING、SHUTDOWN、STOP、TIDYING、TERMINATED。状态流转是理解关闭行为的关键。shutdown()状态变为SHUTDOWN不再接收新任务但会执行完队列中已有任务。shutdownNow()状态变为STOP不再接收新任务尝试中断正在执行的任务并返回队列中未执行的任务列表。注意shutdownNow()不保证立即停止需要任务响应中断。生产环境关闭线程池时通常先shutdown()等待一段时间后再shutdownNow()并配合awaitTermination。第4点线程数设置与队列选择线程数设置没有银弹取决于任务类型CPU密集型线程数 ≈ CPU核数 1减少上下文切换。IO密集型线程数 ≈ CPU核数 × (1 平均等待时间/平均计算时间)通常可设为核数的2倍以上。队列选择同样关键。LinkedBlockingQueue默认无界容易堆积任务导致OOMArrayBlockingQueue有界更安全SynchronousQueue不存储任务直接移交适合高吞吐场景。最佳实践使用有界队列并配合合理的拒绝策略防止资源耗尽。第5点异常处理与监控execute()提交的任务若抛出异常会直接打印到控制台且线程可能终止submit()会捕获异常并封装到Future中只有调用get()才会抛出。因此推荐使用submit()并处理Future或在任务内部用try-catch兜底。监控方面关注核心指标活跃线程数、队列大小、已完成任务数、拒绝任务数。可通过ThreadPoolExecutor的getter方法获取并接入Micrometer或Prometheus。自定义ThreadFactory给线程命名便于排查问题。总结面试回答线程池按这5点展开即可参数与流程、拒绝策略、状态与关闭、线程数与队列、异常与监控。如果能结合业务场景说明选型理由比如“订单系统用CallerRunsPolicy保证不丢单”就能让面试官看到你的实战经验。线程池不是配置完就万事大吉持续监控和动态调优才是高手与普通人的分水岭。
返回列表