ExecutorService 本身不会“无缘无故”丢任务,所谓“丢任务”通常是因为使用方式或配置不当导致任务未被提交、被拒绝、或被中断。下面按常见原因 → 表现 → 解决办法来说明。
shutdown() / shutdownNow()submit() 任务RejectedExecutionExceptionexecutor.shutdown();
executor.submit(() -> {}); // 任务丢失 / 异常
awaitTerminationArrayBlockingQueue(有界队列)maximumPoolSizeDiscardPolicy ✅(直接丢)DiscardOldestPolicynew ThreadPoolExecutor(
1, 1,
0L, TimeUnit.SECONDS,
new ArrayBlockingQueue<>(1),
new ThreadPoolExecutor.DiscardPolicy()
);
AbortPolicy(默认,抛异常)execute() 中任务抛异常 → 线程死,但不影响池submit() 异常被封装在 Future 中
future.get() → 看起来像“没执行”executor.submit(() -> {
throw new RuntimeException("oops");
});
// 不 get,异常完全看不见
afterExecute 钩子shutdown() + awaitTermination()executor.shutdown();
executor.awaitTermination(1, TimeUnit.HOURS);
if (false) {
executor.submit(task); // 永远不执行
}
Executors.newSingleThreadExecutor()
或:
Executors.newCachedThreadPool()
✅ 手动创建 ThreadPoolExecutor,明确参数
executor.shutdownNow();
InterruptedException如果你愿意,可以:
我可以帮你精准定位是哪一类问题。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。