2010-07-03 3 views
5

실행을 계속하기 전에 EDT가 GUI를 업데이트 할 때까지 기다려야하는 작업자 스레드가 있습니다. EDT에게 무언가를 바꾸라고 말하기 위해 게시 방법을 사용했습니다. 그 변화가 일어나기를 노동자가 기다리게하려면 어떻게해야합니까? 그것은 또한 GUI 변경을 시작한다 당신 같은 작업자 스레드의 경우EDT를 기다리는 자바 스윙 작업자 스레드

+2

'일시 중지'버튼을 의미합니까? – trashgod

+2

시도하고 싶은 정말 나쁜 것 같습니다. –

답변

4

후 그 변경이 될 때까지 대기를위한 준비가 내장 된 메커니즘이있다 :

SwingUtilities.invokeAndWait()

멋지게 법안에 맞게해야한다.

또 다른 대안은 SwingUtilities.invokeLater()을 사용하여 EDT에 실행 코드를 지정하면 EDT가 유휴 상태가되면 (즉,이 작업을 실행할 때) 스레드를 깨울 수 있습니다. 이것은 바로 을 발사하고 wait() 다음에 wait()을하기 전에 EDI로부터의 깨우기가 일어나지 않기를 바랄 것입니다. 타이밍과 관련해서는 이것이 절대적으로 안전하지는 않습니다.

5

결과를 게시하는 데 SwingWorker를 사용한다고 가정합니다. 부울 플래그를 사용하여 값이 처리되었음을 나타낼 수 있습니다. 이 플래그는 중간 결과를 게시하기 전에 지워진 다음 설정 될 때까지 스레드를 차단하는 데 사용됩니다. UI 스레드는 게시 된 데이터 처리가 완료되면 플래그를 설정합니다.

class MyWorker extends SwingWorker<K,V> 
{ 
    boolean processed = true; 

    protected void doInBackground() { 
     for (;;) { 
      setProcessed(false); 
      publish(results); 
      waitProcessed(true); 
     } 
    } 

    synchronized void waitProcessed(boolean b) { 
     while (processed!=b) { 
      wait(); 
     } 
     // catch interrupted exception etc. 
    } 

    synchronized void setProcessed(boolean b) { 
     processed = b; 
     notifyAll(); 
    } 


    protected void process(List<V> results) { 
     doStuff(); 
     setProcessed(true); 
    } 
} 
+0

답변 해 주셔서 감사합니다. 나는 Carl Smotricz의 방법을 선택했다. 내 상황에서 더 의미가 있었고 나는 invokeAndWait에 대해 완전히 잊어 버렸다. 그러나 당신이 제안한 방법은 여전히 ​​잘 알고 있습니다. – Mihaela

관련 문제