0

我错过了一些东西,我创建了一个基于可调用的类,并在我的 gui 中创建了一个实例并在执行操作时调用它。唯一的问题是 GUI 没有响应,因为进程在同一个线程上运行,并且必须等待它完成才能访问 GUI。以下是部分代码:

public class MYProject {
public static class CreateProject implements Callable<Boolean>{
    private String m_url;
    private String m_project;
    private String m_options;
    public CreateProject(String url, String project, String options){
        m_url = url;
        m_project = project;
        m_options = options;
    }
    public Boolean call(){
        Boolean result = true;
        try {
            if (os.toLowerCase().contains("windows")){
                command = windowsCMD + command;
            }
            String line;
            Process p = Runtime.getRuntime().exec(command);
            InputStreamReader isr = new InputStreamReader(p.getInputStream());
            BufferedReader bri = new BufferedReader(isr);
            try {
                while ((line = bri.readLine()) != null) {
                    if(line.startsWith("ERROR")){
                        System.out.println(line);
                        result = false;
                        break;
                    }
                }
                p.waitFor();
            }
            finally {
                bri.close();
            }
        }
        catch (Exception err) {
            System.err.println("Unable to create project: " + err.getMessage() 
                                + "\n");
            result = false;
        }
        return result;
    }
}
}

并在 GUI 中:

private void jButtonRefreshActionPerformed(java.awt.event.ActionEvent evt) {
    jTextAreaConsole.append("Creating project.\n");
    MYProject.CreateProject blah = new MYProject.CreateProject("url", "project", "options");
    String result = blah.call();
    jTextAreaConsole.append("Project creation successful: " + result);
}

结果是 Process p 仍然在与 gui 相同的线程上运行,并且没有任何内容是可点击的,并且 jTextAreaConsole 直到进程完成后才会更新。任何人都可以就我应该如何实施这一点提供一些建议吗?

4

3 回答 3

3

实现一个SwingWorker长期运行的任务。有关更多详细信息,请参阅Swing 中的并发。

于 2012-12-13T16:16:42.667 回答
2

结果是 Process p 仍在与 gui 相同的线程上运行,并且没有任何内容是可点击的,并且 jTextAreaConsole

是的,它正在做的正是 p.waitFor(); 在你的代码中

waitFor()

如有必要,使当前线程等待,直到此 Process 对象表示的进程终止。

进程类

您可能想使用像 @Andrew Thompson 发布的 SwingWorker 或者您可以实现 Runnable 的 run 方法并在新线程中启动它,或者甚至使用像 @hoaz 发布的 Executor 类

要使可调用对象在单独的线程中运行,您需要使用 Executors

于 2012-12-13T16:10:37.950 回答
0

Executor您应该使用Callable单独的Thread.

Executor executor = Executors.newSingleThreadExecutor();
executor.submit(blah);
...
executor.shutdown(); // free resources

请注意,您应该创建一次执行程序并在程序退出时将其销毁。否则你可能会泄漏资源。

于 2012-12-13T15:59:12.370 回答