MST

星途 面试题库

面试题:Java单线程池任务执行顺序与异常处理

假设在Java单线程池中提交了一系列任务,其中部分任务可能会抛出异常。请描述任务执行顺序在遇到异常时会如何变化?如何确保即使有任务抛出异常,后续任务仍能正常执行?给出相关代码示例。
37.4万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

任务执行顺序在遇到异常时的变化

在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块捕获异常,确保了即使某个任务抛出异常,后续任务依然能够继续执行。