делает это на самом деле даже гарантировать будущее будет выполняться на всех, , так как ничего не будет ждать результата этого? Сыграет падение не ожидаемые фьючерсы после запроса HTTP-запроса или оставить бегущих в фоновом режиме?
Этот вопрос фактически проходит намного глубже, чем Игра. Вы обычно спрашиваете: «Если я не буду ждать синхронно в будущем, как я могу гарантировать, что он действительно завершится без GCed?». Чтобы ответить на это, нам нужно понять, как GC фактически просматривает потоки. С точки зрения GC поток - это то, что мы называем «root». Такой корень является отправной точкой для кучи, чтобы пересечь его объекты и посмотреть, какие из них имеют право на сбор. Среди корней также есть статические поля, например, которые, как известно, живут на протяжении всего срока службы приложения.
Итак, когда вы его просмотр, как это, и думать о какой Future
на самом деле делает, что очереди функции, которая работает на выделенный поток из пула потоков, доступных через нижележащий ExecutorService
(который мы называем ExecutionContext
в Scala), вы видите, что, хотя вы не ожидаете завершения, среда выполнения JVM гарантирует, что ваш Future
будет запущен до завершения.Что касается объекта Future
, который обертывает функцию, он содержит ссылку на это незавершенное тело функции, поэтому сам Future
не собирается.
Когда вы думаете об этом с этой точки зрения, это вполне логично, так как выполнение Future
происходит асинхронно, и мы обычно продолжаем обрабатывать его в асинхронном режиме с помощью продолжений, таких как map
, flatMap
, onComplete
и т.д.