Java 通过get(0,TimeUnit.Microseconds)`检查'Future'状态是个好主意吗?

Java 通过get(0,TimeUnit.Microseconds)`检查'Future'状态是个好主意吗?,java,concurrency,executorservice,future,Java,Concurrency,Executorservice,Future,我有一个未来,我想知道它的状态是什么。我想到的是这样一个代码: try { // Is that a good idea? Counting on exceptions looks weird. future.get(0, TimeUnit.MICROSECONDS); this.status = DONE; } catch (InterruptedException e) { Thread.currentThread().interrupt(); thr

我有一个
未来
,我想知道它的状态是什么。我想到的是这样一个代码:

try {
    // Is that a good idea? Counting on exceptions looks weird.
    future.get(0, TimeUnit.MICROSECONDS);
    this.status = DONE;
} catch (InterruptedException e) {
    Thread.currentThread().interrupt();
    throw Throwables.propagate(e);
} catch (ExecutionException e) {
    this.status = FAILED;
} catch (TimeoutException e) {
    this.status = RUNNING;
} catch (CancellationException e) {
    this.status = CANCELED;
}
看起来
FutureTask
将尝试持有一个锁,如果它能够获得锁,将检查
Future
的状态。所以这似乎是个好主意


这里有我遗漏的陷阱吗?

作为,只需检查运行状态。但是,您仍然需要调用
get()
来确定它是否成功完成,并检查异常情况。

isDone()和isCancelled()有什么问题,我不认为重新设计它们是个好主意——你应该避免在不需要的时候捕捉异常。离题——但是你考虑过查看Scala Futures/Promises库吗?后者为未来提供了一个设计简洁、可组合的API;根据我的经验,在处理大量异步代码时,这绝对值得。>“//不应该发生,Servlet的线程不应该被中断”这是一个错误的假设。您还可以添加Thread.currentThread().interrupt();因此下一个sleep()/wait()将不会暂停+1为@BorisTreukhov@LuigiR.Viggiano谢谢如果我没有中断我的servlet,还有谁会呢?比如关闭时的容器。这就是为什么我认为只使用异常,而不是使用混合方法。使用异常有什么问题吗?当API中有替代方法时,使用异常来控制程序流通常被认为是不好的做法。@HBase ExecutionException由get()引发,但它不应该是控制程序流的工具,而是用于未检查的异常-即处理意外情况,至于isDone()和isCancelled()——轮询状态以查看任务是否完成或取消并非意外情况。API设计得非常完美。@BorisTreukhov异常是任务中的意外情况,子任务中的异常对于任务管理器来说不是意外情况。我认为混合异常和
if
s(如果我已经需要异常)是没有意义的。这将使代码更加复杂。正如@Duncan在他的评论中提到的,异常不是控制程序流的工具。另一个重要的问题是性能—堆栈展开和异常处理对于java concurrent所追求的高性能API来说是不可接受的。