ExecutorService 是 Java 并发包(java.util.concurrent)中用于管理线程池的核心接口。在使用它的过程中,常见异常主要集中在任务提交、线程池关闭、任务执行、配置不合理等方面。下面按使用场景系统梳理常见异常及其原因和处理建议。
NullPointerException出现场景
executorService.submit(null);
原因
nullCallable/Runnable 内部引用了空对象解决
RuntimeException / Error出现场景
executorService.submit(() -> {
throw new RuntimeException("error");
});
特点
Future.get() 时抛出Future<?> f = executorService.submit(task);
f.get(); // 这里抛 ExecutionException
本质
ExecutionException✅ 建议
try {
future.get();
} catch (ExecutionException e) {
Throwable cause = e.getCause();
}
Future.get() 相关的异常ExecutionException含义
示例
Future<Integer> f = executorService.submit(() -> 1 / 0);
f.get(); // ArithmeticException 被包装
InterruptedException含义
future.get() 时被中断示例
try {
future.get();
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // 恢复中断状态
}
✅ 最佳实践
TimeoutException含义
get(long timeout, TimeUnit unit) 超时示例
future.get(1, TimeUnit.SECONDS);
解决
RejectedExecutionException(最常见)含义
出现场景
executorService.shutdown();
executorService.submit(task); // 抛异常
或:
AbortPolicy(默认)常见触发条件
shutdown() / shutdownNow() 后继续提交任务✅ 解决方案
CallerRunsPolicyif (!executorService.isShutdown()) {
executorService.submit(task);
}
IllegalArgumentException出现场景
Executors.newFixedThreadPool(-1); // 或自定义 ThreadPoolExecutor
原因
✅ 解决
表现
原因
newCachedThreadPool() 无限制创建线程LinkedBlockingQueue() 无界队列✅ 建议
ThreadPoolExecutor 明确参数| 异常 | 触发原因 | 是否常见 |
|---|---|---|
RejectedExecutionException |
线程池关闭 / 满 | ⭐⭐⭐⭐⭐ |
ExecutionException |
任务执行异常 | ⭐⭐⭐⭐ |
InterruptedException |
等待时被中断 | ⭐⭐⭐ |
TimeoutException |
超时未返回 | ⭐⭐⭐ |
NullPointerException |
提交 null 任务 | ⭐⭐ |
IllegalArgumentException |
参数非法 | ⭐ |
✅ 推荐写法
ExecutorService executor = new ThreadPoolExecutor(
2,
4,
60,
TimeUnit.SECONDS,
new ArrayBlockingQueue<>(100),
new ThreadPoolExecutor.CallerRunsPolicy()
);
✅ 任务异常处理
submit → future.get()execute → 自定义 ThreadFactory + UncaughtExceptionHandler如果你愿意,我可以:
submit() 和 execute() 的异常处理差异免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。