thread example ejemplo java scala

example - ¿Cuáles son las diferencias entre un Scala Future y un Java Future?



list callable java (2)

Java Future : Ambos representan el resultado de un cálculo asíncrono, pero el futuro de Java requiere que acceda al resultado a través de un método de obtención de bloqueo. Si bien puede llamar a isDone para averiguar si Java Future se ha completado antes de obtener la llamada, evitando así cualquier bloqueo. debe esperar hasta que Java Future se haya completado antes de continuar con cualquier cálculo que utilice el resultado.

Scala Future : puede especificar transformaciones en un Scala Future si se ha completado o no. Cada transformación da como resultado un nuevo Future que representa el resultado asíncrono del Future original transformado por la función. Esto le permite describir los cálculos asíncronos como una serie de transformaciones.

El futuro de Scala a menudo elimina, la necesidad de razonar sobre los datos y bloqueos compartidos. Cuando invoca un método Scala, realiza un cálculo "mientras espera" y devuelve un resultado. Si ese resultado es un futuro, el futuro representa otro cálculo que se realizará de forma asincrónica a menudo por un subproceso completamente diferente.

Ejemplo : en lugar de bloquear y luego continuar con otro cálculo, puede asignar el próximo cálculo al futuro.

El siguiente futuro se completará después de diez segundos:

val fut = Future { Thread.sleep(10000);21+21}

El mapeo de este futuro con una función que se incrementa en uno producirá otro futuro.

val result = fut.map(x=>x+1)

¿Existen diferencias conceptuales, funcionales o mecánicas entre un Scala Future y un Java Future? Conceptualmente no puedo ver ninguna diferencia, ya que ambos pretenden proporcionar un mecanismo para el cálculo asíncrono.


El principal inconveniente de java.util.concurrent.Future es el hecho de que no se puede obtener el valor sin bloquear.

De hecho, la única forma de recuperar un valor es mediante el método get , que ( cita de los documentos )

Espera si es necesario para que se complete el cálculo, y luego recupera su resultado.

Con scala.concurrent.Future , en cambio, obtiene un cálculo real de no bloqueo, ya que puede adjuntar devoluciones de llamadas para completarlas (éxito / fracaso) o simplemente mapearlas y encadenar múltiples Futuros de manera monádica.

En pocas palabras, el futuro de Scala permite el cálculo asíncrono sin bloquear más hilos de los necesarios.