В настоящее время вы ловите только RuntimeException
, подкласс Exception
.Но ваше приложение может выдавать другие подклассы Exception .Поймать универсальный Exception
в дополнение к RuntimeException
Поскольку многие вещи были изменены на фронте Threading, используйте расширенный API Java.
Предпочитать заранее java.util.concurrent API для многопоточности, например ExecutorService
или ThreadPoolExecutor
.
Вы можете настроить ThreadPoolExecutor для обработки исключений.
Пример со страницы документации Oracle:
Переопределить
protected void afterExecute(Runnable r,
Throwable t)
Метод вызывается после завершения выполнения данного Runnable.Этот метод вызывается потоком, который выполнил задачу.Если значение не равно NULL, Throwable является неперехваченным RuntimeException или Error, которые привели к внезапному завершению выполнения.
Пример кода:
class ExtendedExecutor extends ThreadPoolExecutor {
// ...
protected void afterExecute(Runnable r, Throwable t) {
super.afterExecute(r, t);
if (t == null && r instanceof Future<?>) {
try {
Object result = ((Future<?>) r).get();
} catch (CancellationException ce) {
t = ce;
} catch (ExecutionException ee) {
t = ee.getCause();
} catch (InterruptedException ie) {
Thread.currentThread().interrupt(); // ignore/reset
}
}
if (t != null)
System.out.println(t);
}
}
Использование:
ExtendedExecutor service = new ExtendedExecutor();
Я добавил один конструктор поверх вышеприведенного кода как:
public ExtendedExecutor() {
super(1,5,60,TimeUnit.SECONDS,new ArrayBlockingQueue<Runnable>(100));
}
Вы можете изменить этот конструктор в соответствии с вашими требованиями по количеству потоков.
ExtendedExecutor service = new ExtendedExecutor();
service.submit(<your Callable or Runnable implementation>);