SwingWorker
используется для следующих целей:
- Для запуска длительных задач в другом потоке, чтобы предотвратить зависание графического интерфейса.
- Для обновления графического интерфейса с результатами, полученными в результате длительной задачи в конце задачи с помощью метода
done()
. - Для периодического обновления GUI промежуточными результатами, полученными и опубликованными задачей с помощью методов
publish()
иprocess()
.
SwingUtilities.invokeLater()
может выполнять перечисленные выше задачи следующим образом:
- Вместо выполнения метода
SwingWorker.execute()
из EDT мы можем выполнитьExecutorService.submit(new MyRunnable())
, поскольку он также создаст еще один поток, который может выполнять длительную задачу. - Для обновления графического интерфейса в конце задачи мы можем поместить код (написанный в
done()
методе case1)SwingUtilites.invokeLater(new RunnableToExecuteDoneMethodCode())
в конце задачи. - Для обновления графического интерфейса в середине задачи мы можем поместить код (написанный в
process()
методе case1)SwingUtilites.invokeLater(new RunnableToExecuteProcessMethodCode())
в то место, где мы вызвалиpublish()
метод в case1.
Я задаю этот вопрос, потому что проблема, указанная в вопросе Java - SwingWorker - Можем ли мы вызвать один SwingWorker из другого SwingWorker вместо EDT можно решить с помощью SwingUtilities.invokeLater()
, но нельзя решить с помощью SwingWorker