【发布时间】:2012-09-12 03:15:29
【问题描述】:
根据我看到的番石榴示例,我一直在寻找优雅的解决方案来解决我的问题。具体来说,我喜欢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。
【问题讨论】: