java - SwingWork 链接

标签 java multithreading swing threadpool swingworker

我正在改进 Swing 应用程序的可用性。我正在尝试添加 SwingWorks 以卸载在 EDT 中运行的一些数据库和 IO 调用,从而锁定用户界面。它在很大程度上适用于不依赖于其他任务的孤立任务。

我的问题是一些数据库调用相互依赖(Tas​​k2 必须在 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/

相关文章:

java - Android Twilio "make an HTTP POST to your Messages list resource URI"是什么意思?

java - 由于 OSX 中的其他线程,Platform.exit() 未结束 Javafx

java - 使用 setSelectedIndices 进行 JList 搜索始终选择第一项

java - 单击表格右侧时如何清除表格选择

java - repaint() 方法不调用paintCompnent

java - 根据 ID 和列表中的另一个 ID 查找记录

java - Spring Boot应用程序关闭时不会禁止新的传入连接,但会突然退出

JavaRDD<字符串> 到 JavaRDD<行>

java - MongoDB 池超时

python - concurrent.futures.ThreadPoolExecutor.map 比 for 循环慢