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

How To Run A Process Synchronously in Java?

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

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

我遇到的问题是 process.waitFor() 方法延迟了 GUI 在所有进程完成之前无法执行任何操作(摆动)。

我目前正在使用以下代码结构(我从 this 答案中实现)来部署我的 commands/processes。

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 处于活动状态而不是 slept/waiting 的情况下延迟进程或创建队列?

How can I delay processes or create a queue while maintaining my GUI as active and not slept/waiting?

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

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

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

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

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