如何检查Java线程是否异常终止?
给定一个已完成某些工作的线程(其状态为thread.State.TERMINATED),是否有办法了解该线程是否正确地完成了thread.run()/Runnable.run()方法,或者抛出了一个未捕获的throwable Afaik,线程在正常退出时和抛出可抛掷物时都进入终止状态 有人建议使用未捕获的ExceptionHandler。假设一个线程只能有一个UncaughtExceptionHandler(所有线程的默认值除外),并且线程代码可以更改提供的一个,那么使用它们是一种好的做法吗?您看过吗如何检查Java线程是否异常终止?,java,multithreading,Java,Multithreading,给定一个已完成某些工作的线程(其状态为thread.State.TERMINATED),是否有办法了解该线程是否正确地完成了thread.run()/Runnable.run()方法,或者抛出了一个未捕获的throwable Afaik,线程在正常退出时和抛出可抛掷物时都进入终止状态 有人建议使用未捕获的ExceptionHandler。假设一个线程只能有一个UncaughtExceptionHandler(所有线程的默认值除外),并且线程代码可以更改提供的一个,那么使用它们是一种好的做法吗?您
如果线程上有句柄,则可以捕获uncaufht异常。您可以安装或设置,并让它保存线程退出时的异常 我不知道是否有直接执行的方法,但是您可以在run方法中使用try/catch语句来包围所有代码。如果创建一个布尔值,并将其设置为true(当它以异常终止时),则可以检查状态,如果布尔值为true,则以异常终止,如果布尔值为false,则正确关闭。
可能有更好的方法,但这应该是可行的。您感兴趣的功能可以通过使用
可调用的来实现,该方法将其run方法包装在try{}catch块中,并在遇到问题的未来对象中返回异常。这种方法非常有趣,但是我注意到线程运行的代码覆盖了我提供的处理程序。你可以对它进行黑客攻击,直到线程设置了处理程序,然后添加你自己的处理程序(并且仍然将任何异常链接到它们的处理程序),但这是一个非常糟糕的黑客攻击。如果您有权访问线程的启动位置,那么您可以将提交的Runnable包装到另一个记录异常的Runnable中,然后重新执行。(类似于下面ControlAltDel所建议的)我认为这是处理问题的正确方法,至少在我的情况下,次要线程是由另一个托管线程创建和启动的。考虑到只有一个对象可以声明为处理程序,依赖UncaughtExceptionHandler在这种上下文中不是一个好选项。