2011-11-16 2 views
1

저는 Swing 어플리케이션의 유용성을 향상시키는 과정에 있습니다. EDT에서 실행 중이던 DB 및 IO 호출 중 일부를 오프로드하여 사용자 인터페이스를 잠그기 위해 SwingWorks를 추가하려고합니다. 대부분 다른 작업과의 종속성이없는 격리 된 작업으로 작동했습니다.SwingWork 체이닝

제 문제는 일부 DB 호출이 서로 종속된다는 것입니다 (Task1은 Task1 이후에 발생해야 함). 예를 들어 DB 호출을하고 ComboBox를 업데이트하는 Task1이 있고 DB 호출을하고 JList를 업데이트하는 Task2가 있지만 Task2에 ComboBox에 대한 업데이트가 필요하다고 가정합니다. 내가 가지고있는 것은 Task1 DB 호출 (doInBackground())에 대한 Task2 종속이며 ComboBox의 업데이트 (done())입니다 (따라서 doInBackground를 완료하고 완료해야합니다). 이 문제를 해결할 좋은 방법이 있습니까? Task2가 Task1.doInBackground() 및 Task1.done()이 끝날 때까지 대기하게하는 좋은 방법은 무엇입니까?

답변

3

여러 가지 방법이 있습니다. 하나는 SwingWorker를 계속 사용할 수있게 해줍니다. CountDownLatch을 사용할 수 있습니다. 래치를 태스크 1과 태스크 2 모두에 전달하십시오. 태스크 2의 래치에서 await 메소드를 실행하고 태스크 1이 완료되면 countDown을 래치에 호출하십시오. ExecutorService을 사용하는

public class Task1 implements Runnable{ 
    final CountDownLatchlatch; 
    public Task1 (CountDownLatchlatch latch){ this.latch = latch; } 
    public void run(){ 
    //do work 
    latch.countDown(); 
    } 
} 
public class Task2 implements Runnable{ 
    final CountDownLatchlatch; 
    public Task2 (CountDownLatchlatch latch){ this.latch = latch; } 
    public void run(){ 
    latch.await(); 
    //do work 
    } 
} 

그리고 그것은

CountDownLatch latch = new CountDownLatch(1); 
Runnable task1 = new Task1(latch); 
Runnable task2 = new Task2(latch); 
//submit task1 and task2 

과 같을 것이다 사용이 대안이 될 것입니다. task1을 제출하고 해당 Future를 가져 와서 task2에 할당하고 get()을 task1의 앞으로 할당하십시오.

+0

고마워요! 나는 그것이 내가 찾고있는 것이라고 생각한다. – Dimitry

관련 문제