面试题答案
一键面试任务执行顺序在遇到异常时的变化
在Java单线程池中,任务按照提交顺序依次执行。当一个任务抛出异常时,该任务的执行会立即终止,并且异常会向上层抛出。如果没有在任务内部或者调用处捕获异常,单线程池不会自动处理异常,后续任务将被阻塞,无法继续执行。
确保后续任务仍能正常执行的方法
为了确保即使有任务抛出异常,后续任务仍能正常执行,可以在任务内部捕获异常并进行处理,避免异常向上层抛出。
代码示例
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class SingleThreadPoolExample {
public static void main(String[] args) {
ExecutorService executorService = Executors.newSingleThreadExecutor();
// 提交多个任务
executorService.submit(() -> {
System.out.println("Task 1 started");
// 模拟可能抛出异常的操作
if (Math.random() > 0.5) {
throw new RuntimeException("Task 1 failed");
}
System.out.println("Task 1 completed");
});
executorService.submit(() -> {
System.out.println("Task 2 started");
System.out.println("Task 2 completed");
});
executorService.submit(() -> {
System.out.println("Task 3 started");
// 模拟可能抛出异常的操作
if (Math.random() > 0.5) {
throw new RuntimeException("Task 3 failed");
}
System.out.println("Task 3 completed");
});
// 关闭线程池
executorService.shutdown();
}
}
改进后的代码,在任务内部捕获异常:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class SingleThreadPoolExample {
public static void main(String[] args) {
ExecutorService executorService = Executors.newSingleThreadExecutor();
// 提交多个任务
executorService.submit(() -> {
try {
System.out.println("Task 1 started");
// 模拟可能抛出异常的操作
if (Math.random() > 0.5) {
throw new RuntimeException("Task 1 failed");
}
System.out.println("Task 1 completed");
} catch (Exception e) {
System.out.println("Task 1 caught an exception: " + e.getMessage());
}
});
executorService.submit(() -> {
try {
System.out.println("Task 2 started");
System.out.println("Task 2 completed");
} catch (Exception e) {
System.out.println("Task 2 caught an exception: " + e.getMessage());
}
});
executorService.submit(() -> {
try {
System.out.println("Task 3 started");
// 模拟可能抛出异常的操作
if (Math.random() > 0.5) {
throw new RuntimeException("Task 3 failed");
}
System.out.println("Task 3 completed");
} catch (Exception e) {
System.out.println("Task 3 caught an exception: " + e.getMessage());
}
});
// 关闭线程池
executorService.shutdown();
}
}
通过在每个任务的run
方法内部使用try-catch
块捕获异常,确保了即使某个任务抛出异常,后续任务依然能够继续执行。