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

如何在Java中同步运行进程?,java,multithreading,swing,process,synchronous,Java,Multithreading,Swing,Process,Synchronous,我目前正在开发一个小型swing应用程序,用于格式化驱动器、更改权限以及执行一系列其他小操作 目前,我遇到了一个问题,即运行多个进程会导致它们异步运行,这非常棒,因为它允许我快速调度大量进程,但对于我正在做的事情,我需要进程等待一个进程完成 我遇到的问题是process.waitFor()方法会延迟GUI执行任何操作(swing),直到所有进程都完成 我目前正在使用以下代码结构(我从answer中实现)来部署我的命令/流程 import java.io.IOException; import j

我目前正在开发一个小型swing应用程序,用于格式化驱动器、更改权限以及执行一系列其他小操作

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

我遇到的问题是process.waitFor()方法会延迟GUI执行任何操作(swing),直到所有进程都完成

我目前正在使用以下代码结构(我从answer中实现)来部署我的命令/流程

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处于活动状态而不处于休眠/等待状态

如何延迟进程或创建队列,同时保持GUI处于活动状态而不处于休眠/等待状态

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

有关更多信息和工作示例,请阅读上Swing教程的部分

ExecutorService executor = Executors.newSingleThreadExecutor();
...
executor.execute(() -> yourLongRunningMethod());
其思想是创建一些使用不同线程执行的执行器,并在此线程中执行繁重的任务。在我的示例中,使用了单线程执行器。这将允许您在GUI线程中只花费最少的时间(任务排队很快)


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

谢谢您的建议,我将在周末查看这些教程,并尝试一下它是否有助于我的情况:)谢谢您的建议,我将进一步了解您在本周末建议做的事情,看看它是否有助于我的情况:)
例如,在GUI中显示工作结果)
-这就是为什么您应该使用
SwingWorker
。SwingWorker有一个API,允许您在任务完成时“发布”结果或执行代码。此代码将在EDT上执行。