Llamar asincrónicamente a un método en Java

Muhammad Zeeshan 12 octubre 2023
  1. Use Thread para llamar asincrónicamente a un método en Java
  2. Use FutureTask para llamar asincrónicamente a un método en Java
  3. Use CompletableFuture para llamar asincrónicamente a un método en Java
  4. Use EA Async para llamar asíncronamente a un método en Java
  5. Use la biblioteca Cactoos para llamar asincrónicamente a un método en Java
Llamar asincrónicamente a un método en Java

En este artículo, aprenderemos cómo llamar a una función en Java de forma asíncrona.

Para comenzar, veremos algunas de las herramientas de programación asíncrona integradas de Java, como FutureTask y CompletableFuture. Luego veremos algunas bibliotecas que ofrecen soluciones listas para usar, como EA Async y Cactoos.

Use Thread para llamar asincrónicamente a un método en Java

Podemos comenzar un nuevo hilo para realizar cualquier acción asíncrona. Es más sencillo de entender.

Hagamos un hilo nuevo que sume dos enteros e imprima el resultado:

class example {
  public static void main(String[] args) {
    int num1 = 4;
    int num2 = 5;
    int result = num1 + num2;
    Thread T = new Thread(
        () -> { System.out.println("Addition of " + num1 + " and " + num2 + " is " + result); });
    T.start();
  }
}

Use FutureTask para llamar asincrónicamente a un método en Java

La interfaz Future le permite realizar acciones asincrónicas utilizando FutureTask. Podemos usar el método de envío de ExecutorService para ejecutar el proyecto de forma asíncrona y devolver un objeto FutureTask.

Por ejemplo, aquí está cómo encontrar el factorial de un número:

int num1 = 9;

ExecutorService tp = Executors.newCachedThreadPool();
Future<double> futureTask = tp.submit(() -> factorial(num1));

while (!futureTask.isDone()) {
  System.out.println("Still processing the task");
}
double result = futureTask.get();
tp.shutdown();

Hemos utilizado la función isDone de la interfaz Future para ver si el trabajo se ha terminado. Después de eso, usamos el método get para adquirir el resultado.

Use CompletableFuture para llamar asincrónicamente a un método en Java

Como un híbrido de Future y CompletionStage, CompletableFuture se introdujo en Java 8. Tiene técnicas de programación asincrónica como supplyAsync, runAsync y thenApplyAsync.

Un CompletionStage es una promesa. Garantiza que el cálculo se completará en algún momento.

El CompletionStage es útil porque proporciona varios métodos para adjuntar devoluciones de llamada que se ejecutarán cuando se complete la etapa.

Comencemos desde el principio y hagamos un cálculo asíncrono simple.

Use supplyAsync con CompletableFuture para llamar asíncronamente a un método en Java

CompletableFuture.supplyAsync(this::sendMsg);

Tan simple como eso, la función supplyAsync acepta un proveedor que contiene el código asíncrono. Deseamos utilizar la función sendMsg en este ejemplo.

Use thenAccept con CompletableFuture para llamar asincrónicamente a un método en Java

CompletableFuture.supplyAsync(this::sendMsg).thenAccept(this::notify);

En el primer ejemplo, ejecutamos sendMsg para enviar un mensaje de forma asíncrona. Así que agreguemos una devolución de llamada que nos avise del estado de entrega del mensaje.

Una devolución de llamada se puede introducir de varias maneras; una forma es usar thenAccept. Requiere que se notifique a un usuario, en este ejemplo, para manejar el resultado del cálculo anterior una vez realizado.

Use EA Async para llamar asíncronamente a un método en Java

Aquí hay otra característica de Java que le permite escribir código asincrónico paso a paso, lo que facilita mucho la programación y el escalado. Electronic Arts es el creador de la funcionalidad async-await, que está disponible para el entorno Java a través del paquete ea-async.

Esta característica transforma el código de tiempo de ejecución y reescribe la llamada al método await, comparable a completableFuture.

Entonces podemos usar el método EA-sync conocido como el método await para implementar el código anterior completableFuture llamando a la función Async.init para inicializar el tiempo de ejecución Async.

Aquí, usaremos la función de espera que ofrece la clase Async de EA para modificar el código CompletableFuture descrito anteriormente:

static {
  Async.init();
}

Para configurar el análisis de tiempo de ejecución Async, usamos la función Async.init como estática.

public double example2(int num1) {
  CompletableFuture<double> cf = CompletableFuture.supplyAsync(() -> factorial(num1));
  double result = Async.await(cf);
}

En tiempo de ejecución, la función async cambia el código y reescribe la llamada al método await para operar de manera similar, utilizando una cadena de CompletableFuture.

Use la biblioteca Cactoos para llamar asincrónicamente a un método en Java

Para tareas asincrónicas, esta biblioteca ofrece una clase Async. La biblioteca Cactoos tiene un amplio repertorio, que va desde la manipulación de texto hasta estructuras de datos.

Los tipos y funciones primitivos de esta biblioteca son comparables a los proporcionados por otras bibliotecas como Guava y Apache Commons, aunque están más enfocados en conceptos de diseño orientado a objetos.

Aquí, usando una instancia de la clase Async de Cactoos, encontraremos el factorial de un número.

Async<Integer, Double> a = new Async<Integer, Double>(inputdata -> factorial(inputdata));
Future<Double> asyncFuture = a.apply(num1);
Double result = asyncFuture.get();

La función apply utiliza el método ExecutorService.submit para actuar y devolver un objeto de interfaz Future. La biblioteca Cactoos ofrece clases que realizan las mismas funciones que los métodos estáticos que se encuentran en la biblioteca Apache Commons.

Muhammad Zeeshan avatar Muhammad Zeeshan avatar

I have been working as a Flutter app developer for a year now. Firebase and SQLite have been crucial in the development of my android apps. I have experience with C#, Windows Form Based C#, C, Java, PHP on WampServer, and HTML/CSS on MYSQL, and I have authored articles on their theory and issue solving. I'm a senior in an undergraduate program for a bachelor's degree in Information Technology.

LinkedIn

Artículo relacionado - Java Method