0

임이 누락되었습니다. callable을 기반으로 캘린더를 만들고 gui에서 인스턴스를 만들고 작업이 수행 될 때 호출합니다. 유일한 것은 프로세스가 동일한 스레드에서 실행되고 GUI에 액세스하기 전에 프로세스가 완료 될 때까지 기다려야하므로 GUI가 응답하지 않는다는 것입니다. 여기에 코드의 일부는 다음과 같습니다자바 호출 가능 스레드 스윙 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 아무것도 같은 trhead에서 실행되는

결과는 클릭하고 jTextAreaConsole 나던 업데이트 :

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에

프로세스가 완료 될 때까지 아무도 내가 이것을 구현해야하는 방법에 대한 조언을 할 수 있습니까?

+4

장기 실행 작업을위한'SwingWorker'를 구현하십시오. 자세한 내용은 [동시성의 동시성] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/)을 참조하십시오. –

+0

귀하의 호출 가능 번호는'Callable '입니다. 그렇다면'String result = blah.call()'을하십시오. 어느 쪽이되어야 하는가? – Brian

+0

@Brian 그냥 부울 결과가 있어야합니다. – ubergam3r

답변

2

되는 프로세스 p는 여전히 GUI 아무것도 같은 스레드에서 실행되고 그 결과 클릭하고 jTextAreaConsole

네, 그것은 일을 정확히 p.waitFor(); 귀하의 코드에

waitFor() 

이 Process 객체가 나타내는 프로세스가 종료 될 때까지 현재 스레드가 대기 할 때까지 기다립니다.

Process Class

에서 앤드류 톰슨 을 게시처럼 당신은 SwingWorker의을 사용할 수 있습니다 또는 당신은 Runnable's 실행 방법을 구현하고 집행자 클래스 등을 사용하여 새 스레드 심지어에서 시작할 수 있습니다 @hoaz 당신이을 구현 실행자에게

0

Callable 인스턴스를 Thread으로 실행하려면 Executor을 사용해야합니다.

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

프로그램을 종료 할 때 실행 프로그램을 한 번 만들어 파괴해야합니다. 그렇지 않으면 리소스가 누출 될 수 있습니다.

3

를 사용하는 필요의 separete 스레드에서 실행하기 위해 호출 들어

을 게시 장기 실행 작업에 대해서는을 참조하십시오. 자세한 내용은 Concurrency in Swing을 참조하십시오.