我目前正在构建一个小型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处于活动状态而不是睡眠/等待的情况下延迟进程或创建队列?
答案 0 :(得分:3)
如何在保持GUI处于活动状态而不是睡眠/等待的情况下延迟进程或创建队列?
使用SwingWorker
,以便进程在单独的线程中执行。
阅读Concurrency上Swing教程中的部分,了解更多信息和工作示例。
答案 1 :(得分:2)
ExecutorService executor = Executors.newSingleThreadExecutor();
...
executor.execute(() -> yourLongRunningMethod());
这个想法是你创建了一个使用不同线程执行的执行器,并在这个线程中执行繁重的任务。在我的示例中,使用单线程执行程序。这将允许您只在GUI线程中传递最少的时间(任务排队很快)。
请注意,使用此方法您将至少有两个线程:GUI线程和执行程序线程。他们可能不得不以某种方式进行通信(例如,在GUI中显示工作结果),因此他们可能不得不修改一些共享数据。在这里,您可能需要一些同步(由于并发)。