Основываясь на примерах guava, я видел, что искал элегантные решения моей проблемы. В частности, мне нравится способ Futures.addCallback(ListenableFuture, FutureCallback)
, но я хотел бы иметь возможность установить тайм-аут на время, которое может истечет до вызова функции FutureCallback. Оптимально Было бы неплохо, если бы нарушение таймаута просто вызвало отказ в вызове FutureCallback.
Есть ли у Гувы что-то подобное? Разве не рекомендуется пытаться сочетать тайм-ауты с обратными вызовами?
EDIT: Включая пример кода, который привел меня к этому моменту. Очевидно, я удалил значащие биты, чтобы получить минимальный пример.
@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
.