java - 允许哪些线程调用 SwingWorker#publish?

标签 java multithreading swing swingworker

标准场景:用户按下按钮并开始大任务。 EventThread 创建 SwingWorker 来执行任务并继续生活。

现在,由于大任务是高度可并行化的,SwingWorker 线程做的第一件事就是创建一组工作线程并将工作分摊出去。

我的问题:是否允许工作线程调用 SwingWorker#publish() 来触发 GUI 更新,或者只是 SwingWorker 线程允许这样做吗?

谢谢, 卡斯滕

[编辑] 一些伪代码使我的用例更清晰一些。问题基本上是:下面的代码可以吗?如果我遗漏 waitForAllWorkerThreadsT​​oFinish(); 会怎么样?

public class MySwingWorker extends SwingWorker {

  class MyWorkerThread extends Runnable {
    void run() {
      while(!exitCondition) {
        doSomeWork();
        publish(progressUpdate);
        reEvaluateExitCondition();
      }
    }
  }

  public Void doInBackground() {
    createAndStartBunchOfMyWorkerThreads();
    waitForAllWorkerThreadsToFinish();
  }

  void process(List<V> chunks) {
    updateGuiWithProgress(chunks);
  }
}

最佳答案

一般来说,没有; publish()旨在在后台线程上运行,该线程本身必须同步来自辅助工作人员的所有结果。幸运的是,您在设计后台线程如何执行此操作方面有相当大的自由度。例如,这个 example使用 CountDownLatch .

附录:waitForAllWorkerThreadsT​​oFinish() 看起来是 CountDownLatch 的一个很好的用例. MyWorkerThread 绝对应该 MySwingWorker 以外的线程调用 publish() 而不同步对任何共享数据的访问。 MyWorkerThread 可以使用 invokeLater() 更新 GUI ,但顺序将不可靠。

附录:你问了一个非常实际的问题,

Do you have any reference for your answer, that [other] worker threads are not allowed to use publish()?

Memory Consistency Properties是一个很好的总结。实际上,你会调用 publish()来自没有同步的多个线程。结果将不可预测。

关于java - 允许哪些线程调用 SwingWorker#publish?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6516159/

相关文章:

android - 与 IntentService 的线程同步

java - 透明 PNG 在 Canvas Java 中显示黑色背景

java - JOptionPane 数组元素

java - 如何在 Maven 构建失败时显示自定义消息

java - Hibernate Mapping 有必要吗?

c - 除了 pthread_create 在 linux 上创建 linux 线程的方法

java - 如何在 JavaFX 中显示我自己的线程中的新舞台?

java.lang.ClassCastException : java. util.Vector 无法转换为 org.ksoap2.serialization.SoapPrimitive

java - 作业: how to invoke a java method

java - 为什么我的 JComponent 没有显示在背景 JFrame 之上?