Ответ 1
Обновление: Это добавлено в Guava как Futures.withTimeout()
.
Внутри мы имеем метод makeTimeoutFuture
, который принимает Future
как входной сигнал и возвращает новый Future
, который будет иметь тот же результат, если оригинал не будет завершен в заданный крайний срок. Если истечет срок действия, выход Future
имеет свой результат, равный a TimeoutException
. Таким образом, вы можете вызвать makeTimeoutFuture
и подключить слушателей к выходу Future
.
makeTimeoutFuture
не является самым естественным решением вашей проблемы. На самом деле, я думаю, что метод был создан в основном для установки жесткого тайм-аута на вызовы no-arg get()
, так как это может быть болью для распространения желаемого крайнего срока для всех вызывающих абонентов. Более естественным решением является обоснование того, что get()
соответствует get(long, TimeUnit)
, поскольку addCallback(ListenableFuture, FutureCallback)
соответствует addCallback(ListenableFuture, FutureCallback, long, TimeUnit, SchededuledExecutorService)
. Это немного неуклюжий, хотя и менее, чем makeTimeoutFuture
. Я хотел бы дать эту мысль, прежде чем совершить что-либо. Вы файл запроса функции?
(Здесь мы имеем внутри:)
public static <V> ListenableFuture<V> makeTimeoutFuture(
ListenableFuture<V> delegate,
Duration duration,
ScheduledExecutorService scheduledExecutor)
Возвращает будущее, которое делегирует другому, но заканчивается раньше (через TimeoutException
, завернутый в ExecutionException
), если истечет указанная продолжительность. В этом случае будущее делегата не отменяется.
scheduledExecutor.schedule(new Runnable() {
@Override public void run() {
TimeoutFuture.this.setException(new TimeoutException("Future timed out"));
}
}, duration.getMillis(), TimeUnit.MILLISECONDS);