У меня вопрос о CompletableFuture и его возможное использование для ленивых вычислений.Java 8 CompletedFuture ленивый контроль вычислений
Кажется, что это отличная замена для RunnableFuture
для этой задачи, поскольку можно легко создать цепочки задач и полностью контролировать каждую цепочку ссылок. Тем не менее я обнаружил, что очень сложно контролировать, когда именно происходит вычисление.
Если я просто создаю CompletableFuture
с помощью метода supplyAssync
или что-то в этом роде, все в порядке. Он терпеливо ждет, когда я вызову метод get
или join
. Но если я попытаюсь сделать реальную цепочку с whenCompose
, handle
или любым другим способом, оценка начинается немедленно, что очень расстраивает.
Конечно, я всегда могу поставить задачу блокатора в начале цепочки и отпустить блок, когда я готов начать вычисление, но это кажется немного уродливым решением. Кто-нибудь знает, как управлять, когда действительно выполняется CompletableFuture
.
Проблема не в том, чтобы запускать 'CompletingFuture', когда она мне нужна, но чтобы она не запускалась, когда мне это не нужно. Ваш пример делает то же самое, что я пытаюсь сделать сейчас (так как я не знаю, как это сделать лучше), а именно, поставить триггер в начале цепочки. – Darksnake
Простите, если я не понял. Сам по себе «CompletableFuture» не «запускается». Это фабричный метод 'supplyAsync', который запускает задачу. Если вы используете метод 'supplyAsync', вы не можете управлять при запуске задачи. В моем ответе я пытаюсь предложить метод создания «CompletableFuture» из задачи без использования 'supplyAsync'. – Sam
Я действительно понимаю, я просто надеялся, что есть лучшее решение. В настоящее время я просто создал класс контроллера, который содержит пустой 'CompletableFuture', который должен быть размещен в начале цепочки. Теперь, чтобы начать цепочку, мне нужно просто «закончить» ее. Также я могу отменить всю цепочку до ее начала. – Darksnake