为什么不需要处理 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
.
通知您
您需要了解,如果一个线程由于错误而终止,它不会终止主线程或任何其他线程,因为它们是独立的线程。处理异常仅在线程内可抛出异常时才有意义,代码本身就是 运行。
我有一个这样的代码狙击:
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
.
您需要了解,如果一个线程由于错误而终止,它不会终止主线程或任何其他线程,因为它们是独立的线程。处理异常仅在线程内可抛出异常时才有意义,代码本身就是 运行。