我正在改进 Swing 应用程序的可用性。我正在尝试添加 SwingWorks 以卸载在 EDT 中运行的一些数据库和 IO 调用,从而锁定用户界面。它在很大程度上适用于不依赖于其他任务的孤立任务。
我的问题是一些数据库调用相互依赖(Task2 必须在 Task1 之后发生)。例如,假设我有一个进行数据库调用并更新组合框的任务 1,我有一个进行数据库调用并更新 JList 的任务 2,但任务 2 需要更新组合框。我所拥有的是 Task2 依赖于 Task1 数据库调用 (doInBackground()) 和正在完成的 ComboBox 更新 (done())(因此两者都需要完成 doInBackground 和完成)。有解决这个问题的好方法吗?使 Task2 等待 Task1.doInBackground() 和 Task1.done() 完成的好方法是什么。
最佳答案
您可以通过多种方式做到这一点。一个将使您能够继续使用 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
。提交 task1,获取其对应的 Future,将其分配给 task2 并在 task1 的 future 上get()
。
关于java - SwingWork 链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8155133/