Я пытаюсь понять, почему приведенный ниже код не распечатывает трассировку стека исключения NumberFormatException при запуске?Java: ExecutorService и Callables, неспособные поймать исключение
Я не уверен, что это обычное использование callables и ExecutorService таким образом, я googled и не мог найти решение моей проблемы ... может быть что-то действительно очевидное, что я не вижу.
import java.util.ArrayList;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CallablesTest {
private final static ArrayList<Callable<Void>> mCallables = new ArrayList<>();
private final static ExecutorService mExecutor = Executors.newFixedThreadPool(4);
public static void main(String[] args) throws Exception{
testMethod();
}
static void testMethod() throws Exception {
mCallables.clear();
for(int i=0; i<4; i++){
mCallables.add(new Callable<Void>() {
@Override
public Void call() throws Exception {
//if (Thread.currentThread().isInterrupted()) {
// throw new InterruptedException("Interruption");
//}
System.out.println("New call");
Double.parseDouble("a");
return null;
} //end call method
}); //end callable anonymous class
}
try {
mExecutor.invokeAll(mCallables);
mExecutor.shutdown();
} catch (Exception e) {
e.printStackTrace();
}
}
}
В настоящее время ни одна часть вашего кода не выдает 'NumberFormatException'. 'ExecutorService' не предоставляет прямых исключений, вызванных асинхронным запуском' Callable'. – Savior
Извините, произошла ошибка в коде. Теперь должно быть исключение NumberFormatException. Хотя я не понимаю ваш комментарий: «ExecutorService не раскрывает непосредственно исключения, вызванные асинхронным запуском Callables». – HollowBastion
Точка «ExecutorService» обычно выступает в качестве пула потоков и, следовательно, выполняет ваши «Callable» (ы) для разных потоков. Если выполнение вашего «Callable» выдает исключение в одном из этих других потоков, «ExecutorService» (по умолчанию) не перехватывает его. Он просто отбрасывает его. Вы можете настроить все это, посмотрите на «ThreadPoolExecutor». – Savior