如何在Java中同步运行进程?

时间:2017-04-28 19:49:07

标签: java multithreading swing process synchronous

我目前正在构建一个小型swing应用程序来格式化驱动器并更改权限并执行一些小的其他事情

目前,我遇到过一个问题,即运行多个进程会导致它们异步运行,这很棒,因为它允许我快速调度大量进程,但对于我正在做的事情,我需要进程到等待它之前完成。

我遇到的问题是process.waitFor()方法使GUI无法执行任何操作(swing)直到所有进程完成。

我目前正在使用以下代码结构(我已经从this回答实现)来部署我的命令/进程。

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);
        }
    }
}

如何在保持GUI处于活动状态而不是睡眠/等待的情况下延迟进程或创建队列?

2 个答案:

答案 0 :(得分:3)

  

如何在保持GUI处于活动状态而不是睡眠/等待的情况下延迟进程或创建队列?

使用SwingWorker,以便进程在单独的线程中执行。

阅读Concurrency上Swing教程中的部分,了解更多信息和工作示例。

答案 1 :(得分:2)

ExecutorService executor = Executors.newSingleThreadExecutor();
...
executor.execute(() -> yourLongRunningMethod());

这个想法是你创建了一个使用不同线程执行的执行器,并在这个线程中执行繁重的任务。在我的示例中,使用单线程执行程序。这将允许您只在GUI线程中传递最少的时间(任务排队很快)。

请注意,使用此方法您将至少有两个线程:GUI线程和执行程序线程。他们可能不得不以某种方式进行通信(例如,在GUI中显示工作结果),因此他们可能不得不修改一些共享数据。在这里,您可能需要一些同步(由于并发)。