1021. Предположим в методе run возник RuntimeException, который не был пойман. Что случится с потоком? Есть ли способ узнать о том, что Exception произошел (не заключая все тело run в блок try-catch)? Есть ли способ восстановить работу потока после того как это произошло?
Если в методе run возникает RuntimeException, который не был пойман, то поток завершится. Это может произойти, например, если в методе run будет вызван метод с ошибкой, например, вызов несуществующего метода у объекта.
Есть несколько способов узнать о том, что RuntimeException произошел, не заключая все тело run в блок try-catch. Один из таких способов - установить UncaughtExceptionHandler для потока. Например:
Thread thread = new Thread(new Runnable() {
@Override public void run() {
// ... }
});
thread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override public void uncaughtException(Thread t, Throwable e) {
System.out.println("Exception occurred in thread " + t.getName() + ": " + e.getMessage());
}
});
thread.start();
Здесь мы создали поток и установили UncaughtExceptionHandler для него. Если в потоке возникнет исключение, оно будет передано UncaughtExceptionHandler, и мы сможем обработать его.
Если поток был завершен из-за RuntimeException, то его работу восстановить не удастся. Мы можем создать новый поток и запустить его, но это будет уже новый поток, а не старый, который был завершен.
1606 вопрос-ответ по Java: https://github.com/DEBAGanov/interview_questions
Tелеграмм канал: https://t.me/DEBAGanov
Мое резюме: https://github.com/DEBAGanov