Java:记录FutureTask异常

Java:记录FutureTask异常,java,exception-handling,java.util.concurrent,futuretask,Java,Exception Handling,Java.util.concurrent,Futuretask,我有一个应用程序,它定期提交要在专用线程中执行的任务。这些任务是FutureTask,线程只不过是一个无限循环,当作业进入队列时执行它们,如果为空则进入睡眠状态 有时我需要等待计算结果,所以我调用FutureTask的get方法,如果发生了错误,该方法也会抛出异常。但有些情况下,我不在乎结果是什么,如果有的话,但我需要知道日志、printStackTrace或其他什么。。。如果在任务执行过程中出现某种故障 有没有什么方法可以让我不必等待一个我不需要的get就可以实现这一点 提前谢谢 更新:如果没

我有一个应用程序,它定期提交要在专用线程中执行的任务。这些任务是FutureTask,线程只不过是一个无限循环,当作业进入队列时执行它们,如果为空则进入睡眠状态

有时我需要等待计算结果,所以我调用FutureTask的get方法,如果发生了错误,该方法也会抛出异常。但有些情况下,我不在乎结果是什么,如果有的话,但我需要知道日志、printStackTrace或其他什么。。。如果在任务执行过程中出现某种故障

有没有什么方法可以让我不必等待一个我不需要的get就可以实现这一点

提前谢谢

更新:如果没有其他人等待结果,那么在执行任务后在运行线程上调用get似乎是捕获异常的唯一方法


另一个解决方案是扩展FutureTask类,以提供一个方法,该方法通过java反射公开sync.exception私有字段。

检查线程。UncaughtExceptionHandler

检查线程。UncaughtExceptionHandler

如果我正确理解您的问题,有一个简单的解决方案。修改专用任务运行程序线程,以便在运行每个任务后调用Future.get,并捕获并记录ExecutionException(如果有)

请注意,运行任务后在任务运行程序线程中调用get保证不会阻塞


未捕获的异常处理程序不会有帮助,因为FutureTask将捕获FutureTask包装的Runnable的run方法引发的任何异常和错误。运行“”。

如果我正确理解您的问题,有一个简单的解决方案。修改专用任务运行程序线程,以便在运行每个任务后调用Future.get,并捕获并记录ExecutionException(如果有)

请注意,运行任务后在任务运行程序线程中调用get保证不会阻塞


未捕获的异常处理程序不会有帮助,因为FutureTask将捕获FutureTask包装的Runnable的run方法引发的任何异常和错误。运行“”。

我认为您应该使用“setException”报告任务失败。它将使get报告成为ExecutionException。你也可以看到这一点:


我认为您应该使用“setException”来报告任务失败。它将使get报告成为ExecutionException。你也可以看到这一点:


A在这里可能是一种可能性。使用其中的一个可以让你在期货交易完成后打电话给他们。或者,这些库可以将侦听器添加到将来或将来的任务中,以便在任务完成时执行ListenableFuture及其相关对象。

a在这里可能是一种可能性。使用其中的一个可以让你在期货交易完成后打电话给他们。或者,这些库可以将侦听器添加到将来或将来的任务中,以便在任务完成时执行ListenableFuture及其相关对象。

您还可以查看我为其编写的示例。

您还可以查看我为其编写的示例。

您可以添加更多信息吗?我试图在运行线程上设置UncaughtExceptionHandler,但没有任何更改,因为我认为这些异常不是Uncaught的,而是由FutureTask管理的,在调用get方法之前不会公开。谢谢你能补充更多关于这个的信息吗?我试图在运行线程上设置UncaughtExceptionHandler,但没有任何更改,因为我认为这些异常不是Uncaught的,而是由FutureTask管理的,在调用get方法之前不会公开。ThanksI在Future或FutureTask上找不到此getException方法。我错过什么了吗?感谢您的回答,我在Future或FutureTask中找不到此getException方法。我错过什么了吗?谢谢你的回答,这是我想要避免的;-我有时会提交长时间运行的任务来保存数据库中的信息。。。在这种情况下,我不希望在等待get时被阻止,但我希望看到可能的异常记录在某个地方。谢谢你为什么不在你的线程中捕获异常并记录它们呢?因为FutureTask的run方法不会抛出异常,所以即使我把它放在try-catch块中,也不会记录任何异常。但是你可以在你为FutureTask提供的Runnable.run中捕获它们,不是吗?好的,我明白了。如果您检查我提供的链接,那里的用户将尝试登录覆盖的setException。仅根据上一个响应,这仅在Java 7之后有效,因为Java bug。调用get是我想要避免的;-我有时会提交长时间运行的任务来保存数据库中的信息。。。在这种情况下,我不希望在等待get时被阻止,但我希望看到可能的异常记录在某个地方。谢谢,为什么不在线程中捕获异常并记录它们呢?因为FutureTask的run方法不会抛出异常,所以即使我将它放在try-catch块n中
其他内容都会被记录。但是你可以在你为未来任务提供的Runnable.run中捕获它们,不是吗?好的,我明白了。如果您检查我提供的链接,那里的用户将尝试登录覆盖的setException。仅根据上一个响应,由于Java bug,这只在Java7之后才起作用。