2010-05-13 4 views
9

SwingWorker는 다음과 같은 목적을 위해 사용됩니다의 차이 : 응답되는 것을 GUI를 방지하기 위해 다른 스레드에서 장기 실행 작업을 실행하기위한자바 - SwingWorker의 및 SwingUtilities.invokeLater()

  • done() 메소드를 통해 태스크의 끝에서 장기 실행 태스크에 의해 생성 된 결과로 GUI를 갱신하는 경우.
  • publish()process() 메소드를 사용하여 태스크에 의해 생성되고 공개 된 중간 결과와 함께 GUI를 수시로 업데이트하십시오. 다음과 같이

SwingUtilities.invokeLater() 위의 작업을 수행 할 수 있습니다 : 그것은 또한 장기 실행 작업을 실행할 수있는 다른 스레드를 만들 것 같은

  • 대신 EDT에서 SwingWorker.execute() 방법을 실행, 우리는 ExecutorService.submit(new MyRunnable())을 실행할 수 있습니다.
  • 작업이 끝나면 GUI를 업데이트하기 위해 작업 마지막에 SwingUtilites.invokeLater(new RunnableToExecuteDoneMethodCode()) 코드 (done() case1 메서드로 작성)를 넣을 수 있습니다.
  • 작업 중간에 GUI를 업데이트하려면 case1에서 publish() 메서드를 호출 한 위치에 SwingUtilites.invokeLater(new RunnableToExecuteProcessMethodCode()) 코드 (사례 1의 process() 메서드로 작성)를 넣을 수 있습니다.

내가 질문 Java - SwingWorker - Can we call one SwingWorker from other SwingWorker instead of EDT에 지정된 문제가 SwingUtilities.invokeLater()에 의해 해결 될 수 있지만 SwingWorker

+1

본인은 '질문'이 무엇인지 확실히 모르겠습니다. – akf

+0

@akf 확실하지 않은 경우 퇴장하십시오. Simple :) –

+0

당신이 참조하는 문제는 SwingWorker를 사용하여 해결할 수 있습니다. 저의 대답을보십시오. –

답변

6

SwingWorker으로 해결 될 수 없기 때문에이 질문을하고는 도우미 클래스입니다 - 당신이지 않는다 그것을 사용해야하지만, 그것을 사용하는 것은 손으로 같은 일을하는 것보다 훨씬 간단하고 명확합니다. (또한 점검이 더 쉽게 진행됩니다.) 버전 6이 추가 된 것을 주목하십시오. 그 전에 어떤 사람들은 Swing 튜토리얼에 정의 된보다 간단한 클래스를 사용했거나 언급 한 것과 비슷한 단계를 밟았습니다.

+0

+1 편리하게도 Java 5의 소스 호환 백 포트가 있습니다. https://swingworker.dev.java.net/ – trashgod

1

1.6 + SwingWorker 클래스의 중요한 기능은 doInBackground()와 done() 간의 EDT (Event Dispatch Thread) 차이입니다. doWorkBackup()은 doWorkOutsideEDT()와 done()을 doWorkInsideEDT()로 생각해야합니다. 이 교훈적인 예를 실행하여 다른 것을보십시오.

System.out.println("TID=" + Thread.currentThread().getId() + " (main)"); 
    final SwingWorker<String, String> x = new SwingWorker<String, String>() { 
     @Override 
     protected String doInBackground() throws Exception { 
      final long tid = Thread.currentThread().getId(); 
      System.out.println(""); 
      System.out.println("TID=" + tid + " doInBackground() isEventDispatchThread=" + SwingUtilities.isEventDispatchThread()); 
      System.out.println("Long running code goes here."); 
      return ""; 
     } 

     @Override 
     protected void done() { 
      final long tid = Thread.currentThread().getId(); 
      System.out.println(""); 
      System.out.println("TID=" + tid + "   done() isEventDispatchThread=" + SwingUtilities.isEventDispatchThread()); 
      System.out.println("GUI updates/changes go here."); 
     } 
    }; 
    x.execute(); 
    x.get(); 

출력 :

TID=1 (main) 

TID=9 doInBackground() isEventDispatchThread=false 
Long running code goes here. 

TID=16   done() isEventDispatchThread=true 
GUI updates/changes go here.