可听的未来、未来回拨和超时
根据我看到的番石榴的例子,我一直在寻找解决我问题的优雅解决方案。具体来说,我喜欢Futures.addCallback(ListenableFuture,FutureCallback)
的工作方式,但我希望能够在调用FutureCallback之前设置一个可以过期的时间长度的超时。最好是,如果违反超时只是导致调用 FutureCallback 的失败条件,那就太好了。
番石榴已经有这样的东西了吗?是否只是不建议尝试将超时与回调耦合?
编辑:包括导致我走到这一步的代码示例。显然,我去掉了有意义的位,以获得一个最小的例子。
@Test
public void testFuture()
{
Callable<Boolean> callable = new Callable<Boolean>()
{
@Override
public Boolean call() throws Exception
{
while(true);
}
};
ListenableFuture<Boolean> callableFuture = MoreExecutors.listeningDecorator(Executors.newSingleThreadExecutor()).submit(callable);
Futures.addCallback(callableFuture, new FutureCallback<Boolean>()
{
@Override
public void onFailure(Throwable arg0)
{
System.out.println("onFailure:"+arg0);
}
@Override
public void onSuccess(Boolean arg0)
{
System.out.println("onSuccess:"+arg0);
}
});
try
{
callableFuture.get(1000, TimeUnit.MILLISECONDS);
}catch(Throwable t)
{
System.out.println("catch:"+t);
}
}
此代码将仅打印 。catch:java.util.concurrent.TimeoutException