powiedzieć, że mam następujący kod:Jak poprawnie uchwycić wyjątki RuntimeException z Executorów?
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.execute(myRunnable);
Teraz, jeśli myRunnable
rzuca RuntimeExcpetion
, w jaki sposób można go złapać? Jednym ze sposobów jest dostarczenie mojej własnej implementacji ThreadFactory
do newSingleThreadExecutor()
i ustawienie niestandardowych uncaughtExceptionHandler
s dla Thread
s, które z niej wyjdą. Innym sposobem byłoby zawinięcie myRunnable
do lokalnego (anonimowego) Runnable
zawierającego blokadę try-catch. Być może są też inne podobne rozwiązania. Ale ... jakoś to wydaje się brudne, uważam, że nie powinno to być tak skomplikowane. Czy istnieje czyste rozwiązanie?
Uczciwie kwestionuję sens wychwycenia wyjątku wyrzuconego w * innym * wątku. Czy bieżący wątek musi "dołączyć" do wątku i czekać na zgłoszenie wyjątku? Nie uwzględniłeś tego w pytaniu. – BalusC
@BalusC: Eliminacja wyjątku od wątku roboczego do wątku wywołującego jest powszechnym wymogiem wielu aplikacji. Na przykład aplikacja interfejsu użytkownika może wywoływać wątek SwingWorker, aby wykonać przetwarzanie w tle. Jeśli przetwarzanie zakończy się niepowodzeniem, wyjątek należy przekazać z powrotem do wątku Dispatch zdarzenia. – Adamski
Jest to powszechne wymaganie. Wątek 1 generuje pewną pracę, wykonuje ją za pośrednictwem wątku 2, ale musi wiedzieć, czy się udało, czy nie (tj. Wyrzucił wyjątek). Struktura Executora pomaga ci w tym. –