- Нет .
Вы можете получить хорошее представление об этом, просмотрев исходный код для Promise
/ DefaultPromise
/ Future
,который планирует обратный вызов для foreach
в контексте выполнения / добавляет его к слушателям без какой-либо специальной логики, требующей его запуска в исходном потоке ...
Но вы также можете проверить это экспериментально, попытавшисьустановите контекст выполнения и потоки так, чтобы что-то еще уже было поставлено в очередь на выполнение после завершения Future
, в котором был создан Data
.
implicit val context = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(2))
Future {
new Data(1, "2")
println("Data created on: " + Thread.currentThread().getName)
Thread.sleep(100)
}.foreach { _ =>
println("Data completed on: " + Thread.currentThread().getName)
}
Future { // occupies second thread
Thread.sleep(1000)
}
Future { // queue for execution while first future is still executing
Thread.sleep(2000)
}
Мой вывод:
Данные, созданные для: pool- $ n-thread-1
Данные, завершенные для: pool- $ n-thread-2
2.
Меньшеуверен в себе, чем хотелось бы, но я сделаю это:
Да.
DefaultPromise
, конструкция, лежащая в основе Future
,оборачивает атомарную ссылку, которая ведет себя как переменная переменная.Поскольку запись для обновления результата должна происходить до чтения, из которого результат передается слушателю, чтобы он мог выполнить обратный вызов, правила изменяемой переменной JMM превращают это в отношение happens-before
.