繁体   English   中英

Java可调用线程摆动GUI

[英]Java Callable thread swing gui

我错过了一些东西,我创建了一个基于callable的calss,并在我的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);
}

结果是进程p仍在与gui相同的线程上运行,并且无法单击任何内容,并且jTextAreaConsole直到进程完成后才更新。 谁能提供一些有关我应如何实施的建议?

为长时间运行的任务实现一个SwingWorker 有关更多详细信息,请参见Swing中的并发

结果是进程p仍在与gui相同的线程上运行,并且无法单击任何内容,并且jTextAreaConsole

是的,它确实在做什么p.waitFor(); 在你的代码中

waitFor()

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

工艺类别

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

为了使Callable在单独的线程中运行,您需要使用Executors

您应该使用Executor在单独的Thread运行Callable实例。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM