У меня есть код снайперский, как это:
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++;
}
}
Я не понимаю , почему компилятор не жалуется на основном , потому что MyCallable есть метод , который объявлен как бросает исключение. Я уверен , что я пропускаю что - то очевидное здесь , но просто я не могу увидеть его прямо сейчас. Благодарность
Исключение в отдельном потоке , поэтому вам не нужно обрабатывать его непосредственно в главном потоке. Если call()
сгенерирует исключение отделено нить даст вам знать , над ExecutionException
.
Вы должны понимать, что если поток завершается из-за ошибки не прерывает основной поток, или любой другой поток, потому что они отделенны тема. Обработка исключений имеет отношение только тогда, когда исключение Throwable в потоке код работает сам по себе.