为什么不需要处理 Callable 接口抛出的异常

Why is not needed to handle Exception throw by Callable interface

我有一个这样的代码狙击:

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class UserManagementApplication {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        ExecutorService es = Executors.newSingleThreadExecutor();
        MyCallable callable = new MyCallable(10);
        MyThread thread = new MyThread(10);
        System.out.println(es.submit(callable).get());
        System.out.println(es.submit(thread).get());
        es.shutdown();
    }
}

class MyCallable implements Callable<Integer> {
    private Integer i;

    public MyCallable(Integer i) {
        this.i = i;
    }

    @Override
    public Integer call() throws Exception {
        return --i;
    }
}

class MyThread extends Thread {
    private int i;

    MyThread(int i) {
        this.i = i;
    }

    @Override
    public void run() {
        i++;
    }
}

我不明白为什么编译器在 main 中不报错,因为 MyCallable 有一个方法被声明为 throws Exception。 我确信我在这里遗漏了一些明显的东西,但我现在看不到它。 谢谢

异常是在一个单独的线程中抛出的,所以你不需要直接在主线程中处理它。如果 call() 抛出异常,单独的线程将通过 ExecutionException.

通知您

您需要了解,如果一个线程由于错误而终止,它不会终止主线程或任何其他线程,因为它们是独立的线程。处理异常仅在线程内可抛出异常时才有意义,代码本身就是 运行。