Цепочка SwingWork - PullRequest
       7

Цепочка SwingWork

1 голос
/ 16 ноября 2011

Я нахожусь в процессе улучшения юзабилити приложения Swing. Я пытаюсь добавить SwingWorks, чтобы разгрузить некоторые из вызовов DB и IO, которые выполнялись в EDT, и, таким образом, заблокировать пользовательский интерфейс. Он работал в основном с изолированными задачами, которые не зависят от других задач.

Моя проблема в том, что некоторые вызовы БД зависят друг от друга (задача 2 должна выполняться после задачи 1). Например, скажем, у меня есть Task1, которая выполняет вызов БД и обновляет ComboBox, и у меня есть Task2, который выполняет вызов БД и обновляет JList, но Task2 требует обновления ComboBox. У меня есть то, что Task2 зависит от вызовов DB Task1 (doInBackground ()) и обновления ComboBox завершаются (done ()) (поэтому оба должны быть завершены doInBackground и завершены). Есть хороший способ решить это? Как правильно включить ожидание Task2 для Task1.doInBackground () и Task1.done () для завершения.

1 Ответ

3 голосов
/ 16 ноября 2011

Вы можете сделать это несколькими способами. Один из них позволит вам продолжать использовать SwingWorker. Вы можете использовать CountDownLatch . Передайте защелку как задаче 1, так и задаче 2. В задании 2 запустите метод await для защелки, а когда задача 1 будет завершена, вызовите countDown для защелки.

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

Альтернативой может быть использование ExecutorService. Отправьте задачу 1, получите ее соответствующее будущее, назначьте ее на задачу 2 и get() на будущее задачи 1.

...