Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

384
Vistas
¿Cómo ejecutar un proceso sincrónicamente en Java?

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?

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

¿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.

over 4 years ago · Santiago Trujillo Denunciar

0

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).

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda