Подтвердить что ты не робот

Каковы различия между Scala Future и Java Future

Существуют ли какие-либо концептуальные, функциональные или механические различия между Scala Будущим и Java-Будущим? Понятно, что я не вижу различий, поскольку оба они стремятся обеспечить механизм асинхронного вычисления.

4b9b3361

Ответ 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)