2

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

有时我需要等待计算的结果,所以我调用 FutureTask 的 get() 方法,如果发生不好的事情也会抛出异常。但是在某些情况下,我不在乎结果是什么,如果有的话,但是我需要知道(log、printStackTrace() 或其他什么...)在任务执行期间是否出现某种故障。

有什么方法可以实现这一点而不必等待我不需要的 get() ?

提前致谢!

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

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

4

5 回答 5

0

检查 Thread.UncaughtExceptionHandler

于 2012-05-06T14:29:40.337 回答
0

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

请注意,get在运行任务后调用 task-runner 线程保证不会阻塞。

(未捕获的异常处理程序无济于事,因为run()未来包装的Runnable will be caught byFutureTask.run()` 的方法抛出的任何异常和错误。)

于 2012-05-06T14:52:15.443 回答
0

我认为你应该使用'setException'来报告你的任务失败。它会使 get() 报告一个 ExecutionException。另请参阅:

如何在 FutureTask 中捕获异常

于 2012-05-06T14:57:07.710 回答
0

CompletionService在这里可能是一种可能性。使用其中之一将允许您get()Future确定完成后调用 s。或者,Guava库有一些方法可以将监听器添加到 aFutureFutureTask在任务完成时执行(theListenableFuture及其相关对象)。

于 2012-05-06T15:13:02.670 回答
0

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

于 2012-05-06T17:14:26.693 回答