直接调用Future#get(time, timeunit)(不检查isDone())是不好的做法吗?



这段代码在一个单独的线程中运行一些非常便宜(就时间而言)的方法,因此可以保证外部方法将成功返回99.9999%的确定性。如果完成任务所需的时间超过5秒,我希望终止执行。那么,下面的代码是否需要在if (future.isDone()) ...等中进行一些包装,或者在我的情况下,我可以保持原样?

final Future<SubE> futureEffect = threadPool.submit(effectCallable(lhs, rhs));
try {
    return futureEffect.get(5, TimeUnit.SECONDS);
} catch (InterruptedException | TimeoutException e) {
    throw new eRuleLoadingFailed(e.getMessage());
} catch (ExecutionException e) {
    if (e.getCause() instanceof eAccessDenied) {
        throw (eAccessDenied)e.getCause();
    } else {
        throw new eRuleLoadingFailed(e.getMessage());
    }
}

这里不需要isDone。事实上,它会破坏你的代码。在极少数情况下,执行的代码在主线程到达if后一微秒完成,isDone将返回false,而get根本不会被执行。我觉得这不是你想要的。您希望在所有情况下执行get

相关内容

  • 没有找到相关文章

最新更新