Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检查Java线程是否异常终止?_Java_Multithreading - Fatal编程技术网

如何检查Java线程是否异常终止?

如何检查Java线程是否异常终止?,java,multithreading,Java,Multithreading,给定一个已完成某些工作的线程(其状态为thread.State.TERMINATED),是否有办法了解该线程是否正确地完成了thread.run()/Runnable.run()方法,或者抛出了一个未捕获的throwable Afaik,线程在正常退出时和抛出可抛掷物时都进入终止状态 有人建议使用未捕获的ExceptionHandler。假设一个线程只能有一个UncaughtExceptionHandler(所有线程的默认值除外),并且线程代码可以更改提供的一个,那么使用它们是一种好的做法吗?您

给定一个已完成某些工作的线程(其状态为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在这种上下文中不是一个好选项。