2012-12-13 43 views
0

林失去了一些东西,我已经创建了一个基于可调用,在我的GUI创建一个实例,把它当执行一个动作CALSS。唯一的一点是,该GUI没有响应的过程是相同的线程上运行,并且必须等待它完成之前,我可以访问GUI。下面是一些代码:Java的可赎回线程Swing 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仍然在同一trhead作为GUI并没有什么运行是可以点击和jTextAreaConsole犯规更新在过程结束后,直至完成。任何人都可以就我应该如何实施这个提供一些建议吗?

+4

实现长时间运行任务的'SwingWorker'。有关更多详细信息,请参见[Swing中的并发](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/)。 –

+0

你调用是'赎回'但你做'字符串结果= blah.call()'。它应该是哪一个? – Brian

+0

@布赖恩刚我messign了剪切和粘贴的东西应该ahve了布尔结果。 – ubergam3r

回答

2

的结果是进程p仍是同一个线程中 GUI并没有什么上运行的是点击和jTextAreaConsole

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

waitFor() 

导致当前线程在必要时等待,直到此Process对象表示的进程终止。

Process Class

您可能需要使用的SwingWorker像@Andrew汤普森公布 也可以实现Runnable's run方法和使用的Executor类就像启动它的一个新的线程 甚至@hoaz发布

对于调用在你需要使用的执行人

0

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

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

请注意,您应该创建一次执行,当你的程序退出摧毁它。否则,您可能会泄漏资源。

3

实现一个一个separete线程中运行长时间运行的任务。有关更多详细信息,请参阅Concurrency in Swing