2011-11-13 9 views
6

SwingWorker가 작동을 마칠 때까지 기다린 후 다른 SwingWorker를 실행하고 싶습니다. 이 경우 Encrypteer3는 SwingWorker를 확장하는 클래스입니다.SwingWorker가 끝날 때까지 기다리십시오.

내 코드 :

input = txtTekst.getText(); 
    key = txtKey.getText(); 
    System.out.println("thread1 start"); 
    Encrypteer3 a = new Encrypteer3(); 
    a.execute(); 
    while(a.isDone()==false){ 
     // do nothing 
    } 
    input = output; 
    key = txtKey1.getText(); 
    System.out.println("thread2 start"); 
    Encrypteer3 b = new Encrypteer3(); 
    b.execute(); 
    while(b.isDone()==false){ 
     // do nothing 
    } 

이 내 GUI 동결을하고 (이 작업을 수행 할 때 자바는 CPU의 약 95 %를 사용) CPU를 많이 사용합니다. 문제는 스레드가 완료되었는지 지속적으로 확인하고있는 것이므로 CPU 집중적 인 문제입니다.

SwingWorker 클래스에는 join() 메서드가 없습니다. CPU 사용량을 줄이려면 어떻게해야합니까?

답변

3

나는, SwingWorker의 당신이 외부 실행하려는 경우, 다음 당신이 그것에 대해 listerners 소성 작업을 사용할 수 있습니다 끝났어 때 실행되는 코드를 정의 할 수 있습니다

protected void done() 

을 가지고 빈 루프를 사용하는 것이 나쁜 아이디어라고 생각 SW

+2

에서 예외 (들)을 얻는 방법 문제는 상황에 따라 다른 횟수의 SwingWorker를 사용한다는 것입니다. PropertyChangeListener를 사용했고 트릭을했습니다! – user1026090

+1

@ user1026090 감사합니다. 예, PropertyChangeListener는 문제를 해결하는 또 다른 좋은 방법입니다. 1 + 당신과 자바, mkorbel 및 kowser. –

3

메서드를 SwingWorker에서 무시해야합니다. doInBackground 방법 후, 이벤트 발송 쓰레드상에서 실행 SwingWorker#done()

의 문서에서

이 완료됩니다. 디폴트의 ​​구현은 아무것도 실시하지 않습니다. 서브 클래스는이 메소드를 오버라이드 (override) 해, 이벤트 발송 쓰레드로 완료 액션을 실행할 수 있습니다. 이 메서드의 구현 내에서 상태를 쿼리하여이 작업의 결과를 확인하거나이 작업이 취소되었는지 여부를 확인할 수 있습니다.
public class Encrypteer3 extends SwingWorker<Void, Void>{ 

    @Override 
    protected Void doInBackground() throws Exception { 
     // background task 
     return null; 
    } 

    @Override 
    protected void done() { 
     // will be executed when background execution is done 
    } 

} 

및 실행 시간을 취하고 그것 while(a.isDone()==false) {

.

while(a.isDone()==false) { 
    // do nothing 
} 
0
I want to wait for my SwingWorker to finish working, and then I want 
to execute another SwingWorker. 

구현 Executorif(isDone)을 확인보다 더 나은,하지만 모든 경우에 (SwingWorker를 의미)이 thread을 확인해야 중첩 된 방법 (들)

관련 문제