当前位置: 首页 > 网络应用技术

Java子线程(通用)中的异常治疗

时间:2023-03-07 01:43:04 网络应用技术

  在普通的单线线程程序中,只需要通过尝试来捕获异常...最后...代码块。如何正确捕获子线程中的异常,以相应地处理它?

  有些人可能会觉得这很简单。最好直接在父螺纹启动子线程的地方尝试。实际上,这是错误的。

  让我们回想一下可运行接口的运行方法的完整签名。由于没有标识抛出的语句,因此该方法不会抛出检查异常。因为未检查的异常(如RuntimeException),因为新线程由JVM安排,如果发生异常,则不会将其通知到父线程。

  因此,如何正确处理子线程中的异常情况?房东思考3种常用方法并与您共享。前两种方法是在子线程中处理的,第三种方法是在该方法中处理使用哪种方法的使用取决于此异常是否适合在子插读中处理。

  最简单有效的方法是包裹在子线程的执行方法中可能出现异常的地方。

  子线程代码:

  为线程设置异常处理器。特定方法可以是以下内容:

  (1)螺纹。SetuncaughtexceptionHandler设置当前线程的异常处理器;

  (2)thread.SetDefaultuncaughtexceptionHandler为整个程序设置默认的异常处理器;

  如果当前线程具有异常处理器(没有默认值),则优先级uncaughtexceptionHandler类。否则,如果当前线程属于的线程组

  UndaughtexceptionHandler;否则,请使用全局默认DefaultUncaughtexceptionHandler;如果没有,子线将退出。

  注意:异常发生在子线程中。如果没有类要接管,它将直接退出而无需记录任何日志。

  因此,如果您什么都不做,将会有一个“奇怪”的现象,即未成功执行或没有日志提示。

  设置当前线程的异常处理器:

  或者,设置所有线程的默认异常处理器

  命令行输出:

  使用线程池提交可以获取返回信息的方法,即executorService.submit(可召唤)未来对象,该对象可以在提交后获得线程执行结果。返回值后,您可以捕获executionException异常,因此,异常发生在子线程中。

  子线程代码:

  父线程代码:

  命令行输出:

  以上是三个通用的Java子线程异常治疗方法。什么用途取决于异常是否适合在子线程中处理。房东还建议使用第三种方法来促进根据父线程中的子线抛出的异常(由其独自处理,忽略,或或orcontinue),以呼叫上呼叫党异常)。实际上,房东在其他几种特定方案中也想到了解决方案,并整天分析了解决方案。感谢您的支持。

  原始:https://juejin.cn/post/7102705144323637284