2010-06-08 3 views
2

다른 SwingWorker (MainWorker)에서 SwingWorker (SubWorker)를 실행하려고하면 MainWorker가 SubWorker가 완료 될 때까지 기다려야합니다. 그 동안 MainWorker는 SubWorker의 속성 변경에 따라 자체를 업데이트해야합니다.SwingWorker에서 SwingWorker를 실행 - 처음 하나가 멈출 때까지 기다림

public class MainWorker extends SwingWorker<Void,Void> 
{ 
    public Void doInBackground() 
    { 
     SubWorker sw = new SubWorker(); 
     sw.execute(); 
     try { 
      network.get(); // wait for completion 
     } catch (Exception ex) { 
     } 
     return null; 
    } 
} 

문제는 MainWorker가 완료 될 때까지 SubWorker 완료하기 위해 MainWorker 대기 중에 SubWorker의 doInBackground 메소드가 호출되지 않는 것입니다.

SubWorker를 MainWorker의 활동과 병렬로 실행하려면 어떻게해야합니까?

답변

3

하위 작업자가 한 명이라면 요점은 무엇인지 모르겠습니다. SW 본체에서 작업을 실행할 수없는 이유는 무엇입니까?

병렬 하위 작업이 여러 개이고 그룹화하고 진행 상황을보고하려는 경우 별도의 SwingWorkers가 필요하지 않습니다. 스레드를 시작하거나 실행 프로그램을 사용하여 작업을 예약하십시오. 중간 결과를 게시하려면 차단 대기열을 업데이트에 전달할 작업에 전달합니다.

주 (또는 오히려 유일한) SwingWorker는 해당 큐에서 항목을 가져 와서 publish()/process() 메소드를 사용하여 GUI를 업데이트합니다. 하위 작업이 완료되면 대기열에서 특수 토큰 (또는 null)을 누를 수 있습니다. 이렇게하면 미해결 하위 작업을 추적하고 루프를 종료 할시기를 결정할 수 있습니다.

자체 작업이 많은 경우 CompletionService를 사용하고 SW와 비슷한 방식으로 상태를 업데이트 할 수 있습니다.

+0

감사합니다. Executor를 사용하면 문제가 해결됩니다. – RemiX

관련 문제