【问题标题】:How To Run A Process Synchronously in Java?如何在 Java 中同步运行一个进程?
【发布时间】:2017-04-28 19:49:06
【问题描述】:

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

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

我遇到的问题是 process.waitFor() 方法会延迟 GUI 能够做任何事情(摆动),直到所有进程都完成。

我目前正在使用以下代码结构(我已从 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 处于活动状态而不是休眠/等待状态的同时延迟进程或创建队列?

【问题讨论】:

    标签: java multithreading swing process synchronous


    【解决方案1】:
    ExecutorService executor = Executors.newSingleThreadExecutor();
    ...
    executor.execute(() -> yourLongRunningMethod());
    

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

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

    【讨论】:

    • 感谢您的建议,我会更深入地研究您在本周末建议做的事情,看看它是否对我的情况有帮助:)
    • for example, to display work results in the GUI) - 这就是为什么你应该使用SwingWorker。 SwingWorker 有一个 API,允许您在任务完成时“发布”结果或执行代码。此代码将在 EDT 上执行。
    【解决方案2】:

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

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

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

    【讨论】:

    • 谢谢你的建议,我会在周末看看那些教程,看看它是否对我的情况有帮助:)
    猜你喜欢
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 2021-10-22
    • 2013-04-21
    • 1970-01-01
    • 2015-03-10
    相关资源
    最近更新 更多