Каким потокам разрешено вызывать SwingWorker # publish? - PullRequest
3 голосов
/ 29 июня 2011

Стандартный сценарий: пользователь нажимает кнопку и запускает большую задачу.EventThread создает SwingWorker для выполнения задачи и продолжения жизни.

Теперь, поскольку большая задача имеет высокую степень распараллеливания, первое, что делает поток SwingWorker, это создает группу рабочих потоков и фермработа.

Мой вопрос: разрешено ли рабочим потокам вызывать SwingWorker#publish() для запуска обновления GUI или это разрешено только потоку SwingWorker?

Спасибо, Carsten

[Редактировать] Псевдокод, чтобы сделать мой пример использования более понятным.Вопрос в основном таков: приведенный ниже код в порядке?А что если я пропущу waitForAllWorkerThreadsToFinish();?

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);
  }
}

Ответы [ 2 ]

3 голосов
/ 29 июня 2011

В общем, нет; publish() предназначен для работы в фоновом потоке, который должен сам синхронизировать все результаты, полученные от вспомогательных работников. К счастью, у вас есть достаточно возможностей для разработки того, как это делает фоновый поток. Например, этот пример использует CountDownLatch.

Приложение: waitForAllWorkerThreadsToFinish() выглядит как хороший вариант использования для CountDownLatch. MyWorkerThread определенно должен не вызывать publish() из потока, отличного от MySwingWorker, без синхронизации доступа к каким-либо общим данным. MyWorkerThread может обновить графический интерфейс, используя invokeLater(), но заказ не будет надежным.

Приложение: Вы задали очень практичный вопрос,

У вас есть какие-либо ссылки на ваш ответ, что [другим] рабочим потокам запрещено использовать publish()?

Свойства согласованности памяти - хорошее резюме. По сути, вы будете вызывать publish() из нескольких потоков без синхронизации. Результаты будут непредсказуемыми.

2 голосов
/ 29 июня 2011

Нет ограничений на то, что потоки могут вызывать SwingWorker#publish().

...