Java CompletableFuture, когда вызывается completetableFuture.handle?

Q1. Мое понимание completableFuture.handle вызывается, если будущее завершено либо нормально, либо исключительно. Но как насчет сценария тайм-аута?

Q2. Где проверить настройку тайм-аута по умолчанию для CompletetableFuture? Как это изменить? Что происходит после будущего тайм-аута? (завершение или исключение?)

Q3. Мне необходимо doSomething() до тех пор, пока будущее "выполнено"(завершено или истекло время ожидания или какой-либо заключительный этап). Есть ли метод, который гарантированно будет вызван после того, как будущее "сделано"? Где я должен положить doSomething()?

Новое в завершаемом будущем. Предпочитаю ответы с Java 8. Спасибо за вашу помощь.

1 ответ

В тайм-ауте нет функции CompletableFuture до Java 9. Тем не менее, ваши вопросы все еще можно ответить из-за способа CompletableFuture работает принципиально.

Есть только два способа завершить CompletableFutureобычно (со значением) или исключительно (со значением Throwable). Таким образом, любое завершение, которое не предоставляет значение результата, должно выполняться исключительно, предоставляя возможность выброса.

Так что отмена работает, завершая будущее исключительно с CancellationException, И начиная с Java 9, тайм-аут будет работать, завершая будущее исключительно TimeoutException,

Это подразумевает, что любой этап, который гарантированно будет выполнен по завершении в любом случае, когда он завершен нормально или в исключительном порядке, например, связан с handle или же whenComplete, всегда будет выполняться независимо от того, был ли завершен предварительный этап с исключением, отменен или истек тайм-аут. Вам нужно будет проверить предоставленную метку, чтобы узнать, какой из этих сценариев произошел.

Так как TimeoutException уже существует в Java 8, вы уже можете реализовать специальную обработку для него. Вы даже можете реализовать совместимый триггер для него, например, запланировав действие на ScheduledExecutorService который позвонит completeExceptionally​(new TimeoutException()) о вашем будущем по истечении прошедшего времени (имейте в виду, что это будет игнорироваться, когда будущее уже завершено). Это не сильно отличается от того, как это делает встроенный таймаут в Java 9.

Чтобы обратиться к последней открытой точке, даже в будущих версиях, по умолчанию нет времени ожидания. Будет только тайм-аут, если вы запросите его явно (с указанием предполагаемого значения тайм-аута).

Другие вопросы по тегам