Каковы различия между Scala Future и Java Future
Существуют ли какие-либо концептуальные, функциональные или механические различия между Scala Будущим и Java-Будущим? Понятно, что я не вижу различий, поскольку оба они стремятся обеспечить механизм асинхронного вычисления.
Ответы
Ответ 1
Основным неудобством java.util.concurrent.Future
является то, что вы не можете получить значение без блокировки.
Фактически единственным способом получить значение является метод get
, который (цитирует из документов)
Ожидает, если это необходимо для завершения вычисления, а затем извлекает его результат.
С scala.concurrent.Future
вместо этого вы получаете реальное неблокирующее вычисление, так как вы можете присоединить обратные вызовы для завершения (успех/сбой) или просто сопоставить его и соединить несколько фьючерсов вместе монадическим способом.
Короче говоря, scala Будущее позволяет проводить асинхронные вычисления без блокировки большего количества потоков, чем необходимо.
Ответ 2
Будущее Java: оба представляют результат асинхронного вычисления, но Java Будущее требует, чтобы вы получили результат с помощью метода geting блокировки. Хотя вы можете вызвать isDone, чтобы выяснить, завершилось ли Java Future до вызова get, тем самым избегая блокировки, вы должны дождаться завершения Java-события, прежде чем приступать к любым вычислениям, использующим результат.
Scala Будущее. Вы можете указать преобразования на Scala Будущее, завершилось или нет. Каждое преобразование приводит к новому Будущему, представляющий асинхронный результат исходного Будущего, преобразованного функцией. Это позволяет описывать асинхронные вычисления как последовательность преобразований.
Scala Будущее часто устраняют необходимость использования общих данных и блокировок. Когда вы вызываете метод Scala, он выполняет вычисление "пока вы ждете" и возвращает результат. Если этот результат является Будущим, Будущее представляет собой другое вычисление, которое будет выполняться асинхронно часто с помощью совершенно другого потока.
Пример. Вместо блокировки, а затем продолжения с другим вычислением, вы можете просто сопоставить следующий расчет в будущем.
Следующее будущее будет завершено через десять секунд:
val fut = Future { Thread.sleep(10000);21+21}
Отображение этого будущего с помощью функции, которая увеличивается на единицу, даст другое будущее.
val result = fut.map(x=>x+1)