ThreadPoolExecutor pool = new ThreadPoolExecutor(
    8, 32, 60, TimeUnit.SECONDS,
    new LinkedBlockingQueue<>(2000),
    new ThreadPoolExecutor.CallerRunsPolicy());

批量任务提交到线程池后间歇性抛拒绝异常,重试又成功,日志里任务丢失。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:核心线程与队列都已满,默认拒绝策略直接抛出异常而不阻塞提交方。

这次卡住的地方就在「Java 线程池拒绝」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。监控和日志的时间要对上,时区不一致会多绕很大一圈。

临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。

一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。

处理上按这个顺序:评估任务是 CPU 密集还是 IO 密集;调整队列与最大线程数;对可丢弃任务改为调用方执行策略。

确认没问题再收工,压测时不再出现拒绝异常,任务全部处理完成且耗时可控。

作者 9823189