务本身出现异常时会怎样呢?我们来看一个例子:提交 10 个任务到线程池异步处理,第 5 个任务抛出一个 Run
时间: 2024-10-17 07:15:52 浏览: 20
当任务在执行过程中遇到异常,如Java中的`Runnable`或`Callable`任务在`ThreadPoolExecutor`中运行时抛出异常,通常有以下几种处理方式:
1. **默认处理**:如果不做特殊设置,异常会被记录并打印出来。对于未捕获的异常,程序可能会终止,除非线程池配置了拒绝策略(比如`AbortPolicy`或`CallerRunsPolicy`),在这种情况下,任务会被丢弃,或者按照策略决定如何继续。
2. **捕获异常**:如果在`submit()`方法中设置了`Future`对象,可以使用`get()`或`isDone()`等方法来获取结果,并通过`get()`方法的异常处理机制捕获和处理异常。这允许你决定是否需要恢复、回滚操作或者记录错误日志。
3. **自定义异常处理器**:可以通过实现`UncaughtExceptionHandler`接口,注册一个全局的异常处理器,来统一处理所有未被捕获的线程异常。
4. **任务包装**:可以考虑使用`try-catch`块将任务封装起来,捕获内部的异常并适当地处理或重新抛出。
例如,下面是一个简单的示例:
```java
ExecutorService executor = Executors.newFixedThreadPool(10);
for (int i = 0; i < 10; i++) {
final int taskNum = i;
executor.submit(new Runnable() {
@Override
public void run() {
try {
throw new RuntimeException("Task " + taskNum + " failed");
} catch (Exception e) {
// 捕获异常并记录
System.err.println("Error in Task " + taskNum + ": " + e.getMessage());
}
}
});
}
// 等待所有任务完成,或者设置超时时间
executor.shutdown();
```
在这个例子中,如果第5个任务抛出异常,它会被捕获并在控制台打印错误信息。
阅读全文