В многопоточной программе Java всем потокам не разрешено генерировать неперехваченные проверенные исключения, а это означает, что каждый поток должен обрабатывать свои собственные проверенные исключения. Это ограничено объявлением метода java.lang.Runnable.run() (поскольку в этом объявлении метода нет части исключения исключения). Однако поток все равно может выдать непроверенное исключение. Когда такое исключение будет выдано, поток завершится, а основной поток и другие потоки не будут затронуты вообще, а исключение, выданное определенным потоком, не будет воспринято. all (также там написано, что это исключение вообще невозможно перехватить). Такая конструкция JVM основана на концепции: «Потоки представляют собой независимо выполняемые фрагменты кода. Проблемы потоков должны решаться самим потоком, а не делегироваться наружу». или непроверенные исключения) следует попытаться перехватить и обработать в границах кода потока (внутри метода run).
Но если поток не пытается перехватить непроверенное исключение сам по себе, и мы хотим перехватить и обработать это исключение вне границ кода потока (вне метода run), Java предоставляет нам способ перехватить исключение при возникновении исключения. внутри потока Механизм обратного вызова для обработки исключений за пределами границы кода потока — это метод setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh), предоставляемый объектом Thread.
Установив UncaughtExceptionHandler для потока с помощью этого метода, вы можете гарантировать, что при возникновении исключения в потоке оно может быть обработано путем обратного вызова общедоступного метода void uncaughtException(Thread t, Throwable e) интерфейса UncaughtExceptionHandler. Преимущество. или цель этого состоит в том, что его можно использовать в потоке. За пределами кода (вне метода run() потока) есть место для обработки неперехваченных исключений. Но что должно быть особенно ясно, так это то, что, хотя исключение обрабатывается в методе обратного вызова, метод обратного вызова все еще находится в потоке, который вызвал исключение при его выполнении!
По сравнению с описанным выше методом существует еще один метод программирования, который можно использовать для справки. То есть иногда вызывающая сторона основного потока может просто захотеть узнать, какие исключения произошли во время выполнения подпотока, но это не обязательно. обработать их или обработать немедленно. Затем метод запуска дочернего потока может собирать экземпляры исключений, созданные дочерним потоком, и возвращать их вызывающей стороне в виде списка исключений, а вызывающая сторона может решить, как реагировать в соответствии с ненормальной ситуацией. . Однако важно отметить, что дочерний поток в это время уже завершился.