Actualmente estoy creando una pequeña aplicación swing para formatear unidades y cambiar permisos y realizar un montón de otras cosas pequeñas
Actualmente, me he encontrado con un problema en el que la ejecución de varios procesos hará que se ejecuten de forma asincrónica, lo cual es increíble porque me permite enviar una tonelada de procesos rápidamente, pero para lo que estoy haciendo necesito que el proceso espere a que el uno antes de terminar.
El problema que he encontrado es que el método process.waitFor() retrasa que la GUI no pueda hacer nada (swing) hasta que finalicen todos los procesos.
Actualmente estoy usando la siguiente estructura de código (que he implementado a partir de esta respuesta) para implementar mis comandos/procesos.
import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; class RunSynchronously{ private static final String sudoPassword = "1234"; public static void main(String[] args) { Process process = null; String[] firstCmd = {"/bin/bash", "-c", "echo " + sudoPassword + "| sudo -S chmod 777 -R /media/myuser/mydrive"}; try { process = Runtime.getRuntime().exec(firstCmd); } catch (IOException ex) { Logger.getLogger(Wizard_Home.class.getName()).log(Level.SEVERE, null, ex); } try { process.waitFor(); } catch (InterruptedException ex) { Logger.getLogger(Wizard_Format.class.getName()).log(Level.SEVERE, null, ex); } String[] secondCmd = {"/bin/bash", "-c", "echo " + sudoPassword + "| sudo -S chmod 755 -R /media/myuser/mydrive"}; try { process = Runtime.getRuntime().exec(secondCmd); } catch (IOException ex) { Logger.getLogger(Wizard_Home.class.getName()).log(Level.SEVERE, null, ex); } try { process.waitFor(); } catch (InterruptedException ex) { Logger.getLogger(Wizard_Format.class.getName()).log(Level.SEVERE, null, ex); } } }¿Cómo puedo retrasar procesos o crear una cola mientras mantengo mi GUI activa y no dormida/esperando?
¿Cómo puedo retrasar procesos o crear una cola mientras mantengo mi GUI activa y no dormida/esperando?
Use un SwingWorker para que los procesos se ejecuten en un subproceso separado.
Lea la sección del tutorial de Swing sobre Concurrencia para obtener más información y ejemplos prácticos.
ExecutorService executor = Executors.newSingleThreadExecutor(); ... executor.execute(() -> yourLongRunningMethod());La idea es que cree un ejecutor que use un hilo diferente para la ejecución y ejecute su tarea pesada en este hilo. En mi ejemplo, se usa un ejecutor de un solo hilo. Esto le permitirá pasar solo una cantidad mínima de tiempo en su subproceso GUI (la puesta en cola de tareas es rápida).
Tenga en cuenta que con este método tendrá al menos dos subprocesos: un subproceso GUI y un subproceso ejecutor. Probablemente tendrán que comunicarse de alguna manera (por ejemplo, para mostrar los resultados del trabajo en la GUI), por lo que probablemente tendrán que modificar algunos datos compartidos. Aquí, es posible que necesite alguna sincronización (debido a la concurrencia).