llamando a un método que consume mucho tiempo desde un JButtonActionPerformed

En las siguientes líneas de código cuando se presiona el Botón 1, el Jframe deja de responder hasta que se completa la ejecución del método encode (). Pero necesito actualizar una barra de progreso en Jframe que muestra el progreso.

private void Button1ActionPerformed(java.awt.event.ActionEvent evt) {                                   
    try {
        if (flagState == 0) {
            WavFile.decode(readWavFile, msg.getText(), key.getText().hashCode());
        } else if (flagState == 1) {
            WavFile.encode(readWavFile, msg.getText(), key.getText().hashCode());            
        }
    } catch (WavFileException | IOException e) {
        notes.setText(e.getMessage());
    }
}         

Pensé en hacer esto

private void Button1ActionPerformed(java.awt.event.ActionEvent evt) {                                   
    try {
        if (flagState == 0) {
            Thread t = new Thread(new Runnable() {
                               public void run() {
                                  WavFile.decode(readWavFile, msg.getText(), key.getText().hashCode()); 
                               }
                            };)
            t.start();
        } else if (flagState == 1) {
            Thread t = new Thread(new Runnable() {
                               public void run() {
                                  WavFile.encode(readWavFile, msg.getText(), key.getText().hashCode()); 
                               }
                            };)
            t.start();
        }
    } catch (WavFileException | IOException e) {
        notes.setText(e.getMessage());
    }
} 

y actualice la barra de progreso desde el método encode ().

Pero entiendo que habrá un fuerte acoplamiento entre los módulos y no quiero eso.

Tampoco creo que llamar a un nuevo hilo cada vez sea una buena idea (pensé en ExecutorService pero no estoy seguro de cómo usarlo).

¿Qué debo hacer para convertir esto en un código de pieza decente?

Respuesta 1

Enhebrar es definitivamente algo que debes presentar aquí. Cualquier cosa que tarde mucho tiempo en completarse no debe ejecutarse en el hilo de eventos awt.

Generar un nuevo hilo cada vez que se hace clic en el botón no es un problema inherente. Sin embargo, debe considerar que puede ser posible generar muchos hilos haciendo lo mismo antes de que se complete el primero. Puede usar un ejecutor si lo desea, pero probablemente no sea necesario.

En cuanto al seguimiento del progreso, agregaría otro hilo que periódicamente consulta al otro hilo y actualiza la barra de progreso según sea necesario. Así es como lo estructuraría:

private void Button1ActionPerformed(java.awt.event.ActionEvent evt) {
    disableButton1();
    final Thread t;
    if (flagState == 0) {
        t = new Thread(new Runnable() {
            public void run() {
                try {
                    WavFile.decode(readWavFile, msg.getText(), key.getText().hashCode());
                } catch (WavFileException | IOException e) {
                    notes.setText(e.getMessage());
                }
            }
        });
    } else if (flagState == 1) {
        t = new Thread(new Runnable() {
            public void run() {
                try {
                    WavFile.encode(readWavFile, msg.getText(), key.getText().hashCode()); 
                } catch (WavFileException | IOException e) {
                    notes.setText(e.getMessage());
                }
            }
        });
    }

    Thread monitor = new Thread(new Runnable() {
        public void run() {
            try {
                while (notComplete(t)) {
                    setProgressBar(getProgress(t));
                    Thread.sleep(SLEEP_TIME);
                }
                t.join();
            } finally {
                enableButton1();
            }
        }
    });

    t.start();
    monitor.start();
}
Respuesta: 2

En las siguientes líneas de código cuando se presiona el Botón 1, el Jframe deja de responder hasta que se completa la ejecución del método encode (). Pero necesito actualizar una barra de progreso en Jframe que muestra el progreso.

tiene un problema con Concurency en Swing , bloquea el EDT , causó que la GUI no respondiera, hasta que el código terminó

Respuesta: 3

Estoy tratando de crear una aplicación Java y tengo una pregunta sobre una función dentro de la API de gson. ¿Por qué esta línea de código genera un archivo json vacío sin mostrar ningún error? Un ejemplo ...

Así que estoy haciendo algunos cambios / correcciones al mod de subclipse de alguien y tenía algunas preguntas. Primero, noté que una confirmación de svn falla al intentar confirmar un solo archivo que es idéntico al existente ...

A continuación hay un código que encontré sobre 'net y no puedo hacerlo funcionar. Que yo sepa, debería funcionar. Lamentablemente, cuando utilicé s_server en el kit de herramientas OpenSSL, no registró una conexión. El servidor ...

Soy bastante nuevo en Jackson y Spring-Boot. Estoy tratando de analizar el objeto JsonNode para recuperar una propiedad anidada del objeto JsonNode como una cadena. Esto es para una aplicación de arranque de primavera donde ...