SwingWorker en Java

SwingWorker es una clase abstracta desarrollada para la biblioteca Swing del lenguaje de programación Java. Se utiliza para realizar largas tareas de interacción con la GUI en un subproceso en segundo plano. Mientras se desarrollan aplicaciones, a veces la GUI se bloquea cuando intenta realizar una tarea enorme o prolongada. Este retraso es un gran cuello de botella. Para tales fines, se desarrolló SwingWorker, que programa la ejecución de esta larga tarea en un subproceso diferente mientras la GUI sigue respondiendo.

El lenguaje Java tiene tres subprocesos , a saber, se enumeran a continuación de la siguiente manera: 

  1. Subproceso actual (subproceso inicial): este es el subproceso en el que se ejecuta la lógica de la aplicación inicial.
  2. Subproceso de envío de eventos : todo el código de manejo de eventos se ejecuta en este subproceso.
  3. Subprocesos de trabajo : también conocidos como subprocesos en segundo plano donde se ejecutan todas las tareas en segundo plano que consumen mucho tiempo.

SwingWorker permite a los usuarios programar la ejecución de tareas en segundo plano en Worker Thread. Pero, ¿cómo sabrá el usuario cuándo la tarea ha terminado su ejecución o si el usuario necesita actualizar la GUI (ejecutándose en el subproceso inicial) según la ejecución del subproceso? Esto implica que también necesitamos comunicación entre subprocesos . SwingWorker está diseñado para situaciones tan complicadas que proporcionan comunicación en el hilo de envío de eventos.

Métodos importantes de SwingWorker

Método Acción realizada
cancelar() Intenta cancelar la ejecución de esta tarea. Este intento fallará si la tarea ya se completó, ya se canceló o no se pudo cancelar por algún otro motivo. Si tiene éxito y esta tarea no se ha iniciado cuando se llama a cancelar, esta tarea nunca debería ejecutarse. Si la tarea ya comenzó, el parámetro mayInterruptIfRunning determina si el subproceso que ejecuta esta tarea debe interrumpirse en un intento de detener la tarea. 

Después de que este método regrese, las llamadas subsiguientes a Future.isDone() siempre devolverán verdadero. Las llamadas posteriores a Future.isCancelled() siempre devolverán verdadero si este método devolvió verdadero.

hacerEnFondo() Contiene nuestra lógica de la tarea en segundo plano, es decir, lo que queremos que haga nuestro subproceso. Se ejecuta en un subproceso de trabajo y es necesario implementarlo.
hecho() Se llama cuando el hilo terminó su ejecución. Además, cualquier valor devuelto por la función doInBackground() puede recibirse dentro de esta función usando get(). Además, se pueden realizar actualizaciones en la GUI dentro de esta función. Por lo tanto, la función se ejecuta en el subproceso de envío de eventos después de que finaliza el método doInBackground.
ejecutar() Programa este SwingWorker para su ejecución en un subproceso de trabajo.
obtenerProgreso() Devuelve la propiedad de límite de progreso.
 obtenerEstado() Devuelve la propiedad vinculada al estado de SwingWorker.
está cancelado() Devuelve verdadero si esta tarea se canceló antes de que se completara normalmente. 
está hecho() Devuelve verdadero si se completa esta tarea. La finalización puede deberse a una finalización normal, una excepción o una cancelación; en todos estos casos, este método devolverá verdadero. 
obtener() Espera, si es necesario, a que se complete el cálculo y luego recupera su resultado.
proceso() Recibe fragmentos de datos del método de publicación de forma asíncrona en el subproceso de envío de eventos. Debido a que este método se invoca de forma asíncrona, es posible que se haya llamado a la publicación() varias veces.
publicar() Se debe usar desde dentro del método doInBackground para entregar resultados intermedios para el procesamiento en el subproceso de envío de eventos dentro del método de proceso. 
correr() Establece este Futuro en el resultado del cómputo a menos que haya sido cancelado.
establecerProgreso() Establece la propiedad de límite de progreso. El valor debe ser de 0 a 100. 

Implementación: SwingWorker

Queremos que el hilo comience a ejecutarse cuando se haga clic en el botón. Ver startThread() dentro del oyente de acción del botón. La función startThread define un nuevo swingworker del tipo javax.swing.SwingWorker donde:

  • T: el tipo de resultado devuelto por los métodos doInBackground y get de este SwingWorker, que es String en el código siguiente. 
  • V: el tipo utilizado para llevar a cabo resultados intermedios por los métodos de publicación y proceso de este SwingWorker, que es Integer en el siguiente código.

Ejemplo 

Java

// Java Program to Illustrate Working of SwingWorker Class
  
// Importing required classes
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.List;
import java.util.concurrent.ExecutionException;
import javax.swing.*;
  
// Main class
// SwingWorkerSample
public class GFG {
  
    private static JLabel statusLabel;
    private static JFrame mainFrame;
  
    // Method
    public static void swingWorkerSample()
    {
        mainFrame = new JFrame("Swing Worker");
        mainFrame.setSize(400, 400);
        mainFrame.setLayout(new GridLayout(2, 1));
  
        mainFrame.addWindowListener(new WindowAdapter() {
            // Method
            @Override
            public void windowClosing(WindowEvent e)
            {
                System.exit(0);
            }
        });
  
        statusLabel
            = new JLabel("Not Completed", JLabel.CENTER);
        mainFrame.add(statusLabel);
  
        JButton btn = new JButton("Start counter");
        btn.setPreferredSize(new Dimension(5, 5));
  
        btn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                System.out.println(
                    "Button clicked, thread started");
                startThread();
            }
        });
  
        mainFrame.add(btn);
        mainFrame.setVisible(true);
    }
  
    // Method
    private static void startThread()
    {
  
        SwingWorker sw1 = new SwingWorker() {
            // Method
            @Override
            protected String doInBackground()
                throws Exception
            {
  
                // Defining what thread will do here
                for (int i = 10; i >= 0; i--) {
                    Thread.sleep(100);
                    System.out.println("Value in thread : "
                                       + i);
                    publish(i);
                }
  
                String res = "Finished Execution";
                return res;
            }
  
            // Method
            @Override protected void process(List chunks)
            {
                // define what the event dispatch thread
                // will do with the intermediate results
                // received while the thread is executing
                int val = chunks.get(chunks.size() - 1);
  
                statusLabel.setText(String.valueOf(val));
            }
  
            // Method
            @Override protected void done()
            {
                // this method is called when the background
                // thread finishes execution
                try {
                    String statusMsg = get();
                    System.out.println(
                        "Inside done function");
                    statusLabel.setText(statusMsg);
                }
                catch (InterruptedException e) {
                    e.printStackTrace();
                }
                catch (ExecutionException e) {
                    e.printStackTrace();
                }
            }
        };
  
        // Executes the swingworker on worker thread
        sw1.execute();
    }
  
    // Main driver method
    public static void main(String[] args)
    {
        swingWorkerSample();
    }
}

Producción:

  • Ejecute el código anterior, haga clic en el botón y verá un contador decreciente. Haga cualquier cosa simultáneamente con la interfaz de usuario, seguirá respondiendo.
  • Los fragmentos de lista son el parámetro de la función process() y contienen la lista de todos los resultados publicados por el subproceso hasta este momento del tipo de datos Integer. El tipo de datos Integer debe coincidir con nuestra declaración swingworker.

Este artículo es una contribución de Ekta Goel . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks. Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente. 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-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 *