Гарантируется ли swingWorker событие изменения свойства состояния по завершении? - PullRequest
4 голосов
/ 06 октября 2011

У меня есть класс, который принимает число SwingWorkers и запускает их по одному в определенном порядке. Я использую ReentrantLock, чтобы убедиться, что одновременно работает только один работник. Обычно я всегда разблокирую в пункте finally, но мне нужно, чтобы он оставался заблокированным до завершения рабочего процесса.

        nextWorker.getPropertyChangeSupport().addPropertyChangeListener("state", 
        new PropertyChangeListener()
        {
           @Override
           public void propertyChange(PropertyChangeEvent evt)
           {
              if (evt.getNewValue().equals(SwingWorker.StateValue.DONE))
              {
                 executionLock.unlock();
              }
           }
        });

Если это не так, гарантированно вызывается метод done ()? Я бы предпочел не вызывать анлок таким способом, так как это в некоторой степени нарушит инкапсуляцию.

В связи с характером проекта вполне вероятно, что это появится в обзоре кода. В этом случае было бы полезно иметь проверяемый источник. До сих пор я не смог найти один.

1 Ответ

6 голосов
/ 06 октября 2011
  • лично я перепробовал все возможное с SwingWorker, но всегда заканчивал меня done(), но я думаю, что нет никакой гарантии, что реализованные методы из Future заканчиваются правильно, все еще там это Ошибка

  • Нет никакого представления о вашем коде о блокировке / разблокировке другого потока или процесса, но я предлагаю использовать Executor для многопоточности,

  • как получить исключения из SwingWorker Задание

  • лично у меня никогда не было плохого опыта с SwingWorker или какого-то неожиданного недостатка, новсе MultiThreading Гуру рассказывал о SwingWorker для производственного кода никогда, все еще требуется использование Runnable#Thread вместо SwingWorker

...