Callbacks asincrónicos y sincrónicos en Java

Una función de devolución de llamada es una función que se pasa a otra función como argumento y se espera que se ejecute después de algún tipo de evento. El propósito de la función de devolución de llamada es informar a una clase Sync/Async si se realizó algún trabajo en otra clase. Esto es muy útil cuando se trabaja con tareas asincrónicas. Supongamos que queremos realizar algunas tareas de rutina, como realizar alguna operación o mostrar contenido después de hacer clic en un botón, o buscar datos de Internet. Esto también se usa en el manejo de eventos, ya que recibimos una notificación cuando se hace clic en un botón a través de la función de devolución de llamada.

Este tipo de patrón de diseño se utiliza en el patrón de diseño del observador . El patrón del observador es un patrón de diseño de software en el que un objeto, llamado sujeto, mantiene una lista de sus dependientes, llamados observadores, y les notifica automáticamente cualquier cambio de estado, generalmente mediante llamando a uno de sus métodos ( Fuente: wiki ).

En Java, las devoluciones de llamada se pueden implementar mediante una interfaz. El procedimiento general para la implementación se indica a continuación.

  1. Define the methods in an interface that we want to invoke after callback.
  2. Define a class that will implement the callback methods of the interface.
  3. Define a reference in other class to register the callback interface.
  4. Use that reference to invoke the callback method.

Devolución de llamada síncrona

La ejecución del código bloqueará o esperará el evento antes de continuar. Hasta que su evento devuelva una respuesta, su programa no se ejecutará más. Básicamente, la devolución de llamada realiza todo su trabajo antes de volver a la declaración de llamada. El problema con las devoluciones de llamadas sincrónicas es que parecen retrasarse.

A continuación se muestra la implementación simple de este principio.

// Java program to illustrate synchronous callback
interface OnGeekEventListener {
  
    // this can be any type of method
    void onGeekEvent();
}
  
class B {
  
    private OnGeekEventListener mListener; // listener field
  
    // setting the listener
    public void registerOnGeekEventListener(OnGeekEventListener mListener)
    {
        this.mListener = mListener;
    }
  
    // my synchronous task
    public void doGeekStuff()
    {
  
        // perform any operation
        System.out.println("Performing callback before synchronous Task");
  
        // check if listener is registered.
        if (this.mListener != null) {
  
            // invoke the callback method of class A
            mListener.onGeekEvent();
        }
    }
  
    // Driver Function
    public static void main(String[] args)
    {
        B obj = new B();
        OnGeekEventListener mListener = new A();
        obj.registerOnGeekEventListener(mListener);
        obj.doGeekStuff();
    }
}
  
class A implements OnGeekEventListener {
  
    @Override
    public void onGeekEvent()
    {
        System.out.println("Performing callback after synchronous Task");
        // perform some routine operation
    }
    // some class A methods
}

Producción:

Performing callback before synchronous Task
Performing callback after synchronous Task

Devolución de llamada asíncrona

Una llamada asincrónica no bloquea la ejecución del código del programa. Cuando la llamada regresa del evento, la llamada vuelve a la función de devolución de llamada. Entonces, en el contexto de Java, tenemos que crear un nuevo hilo e invocar el método de devolución de llamada dentro de ese hilo. La función de devolución de llamada se puede invocar desde un subproceso, pero no es un requisito. Una devolución de llamada también puede iniciar un nuevo hilo, haciéndose así asíncrona.

A continuación se muestra la implementación simple de este principio.

// Java program to illustrate Asynchronous callback
  
interface OnGeekEventListener {
  
    // this can be any type of method
    void onGeekEvent();
}
  
class B {
  
    private OnGeekEventListener mListener; // listener field
  
    // setting the listener
    public void registerOnGeekEventListener(OnGeekEventListener mListener)
    {
        this.mListener = mListener;
    }
  
    // My Asynchronous task
    public void doGeekStuff()
    {
  
        // An Async task always executes in new thread
        new Thread(new Runnable() {
            public void run()
            {
  
                // perform any operation
                System.out.println("Performing operation in Asynchronous Task");
  
                // check if listener is registered.
                if (mListener != null) {
  
                    // invoke the callback method of class A
                    mListener.onGeekEvent();
                }
            }
        }).start();
    }
  
    // Driver Program
    public static void main(String[] args)
    {
  
        B obj = new B();
        OnGeekEventListener mListener = new A();
        obj.registerOnGeekEventListener(mListener);
        obj.doGeekStuff();
    }
}
  
class A implements OnGeekEventListener {
  
    @Override
    public void onGeekEvent()
    {
        System.out.println("Performing callback after Asynchronous Task");
        // perform some routine operation
    }
    // some class A methods
}

Producción:

Performing operation in Asynchronous Task
Performing callback after Asynchronous Task

Cuándo usar qué

Devolución de llamada síncrona: cualquier proceso que tenga múltiples tareas donde las tareas deben ejecutarse en secuencia y no ocupan mucho tiempo debe usar devoluciones de llamada síncronas.
Por ejemplo: está en la cola de una película para comprar una entrada y no puede obtener una hasta que todos los que están delante de usted obtengan una.

Devolución de llamada asíncrona: cuando las tareas no dependen unas de otras y pueden tardar algún tiempo en ejecutarse, debemos usar devoluciones de llamada asíncronas.
Por ejemplo: cuando pides tu comida, otras personas también pueden pedir su comida en el restaurante. No tienen que esperar a que finalice su pedido, si está descargando una canción de Internet, obteniendo una respuesta API.

Referencias:
https://www.javaworld.com/article/2077462/learn-java/java-tip-10–implement-callback-routines-in-java.html
https://en.wikipedia.org/wiki/Callback_ (programación de computadoras)

Publicación traducida automáticamente

Artículo escrito por rishabh jindal 1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *