Почему SwingWorker? Почему не просто Thread или Runnable?

В чем преимущества использования SwingWorker вместо Thread или Runnable?

Ответы

Ответ 1

Thread и Runnable были частью Java 1.0; они так же хороши, как и тогда.

Новые классы concurrency перегоняют все, что было известно о многопоточности с тех пор (спасибо, Дуг Ли и другие). Написание многопоточного кода ужасно сложно. Новые классы concurrency, включая SwingWorker, попытаются сделать это проще.

Начните с обозначения дженериков для сильной типизации. Там создан механизм для публикации и обработки как окончательных, так и промежуточных результатов.

Можно было бы имитировать их с помощью Thread и Runnable, но SwingWorker сделал это для вас.

Ответ 2

Я думаю, что документация SwingWorker довольно хороша:

Абстрактный класс для выполнения длинных GUI-взаимодействующие задачи в специализированном нить.

При написании многопоточного приложение с использованием Swing, есть два ограничения, о которых следует помнить: (см. Как использовать темы для получения более подробной информации):

  • Затраты времени на выполнение задач не должны выполняться в разделе "Диспетчер событий". В противном случае приложение становится отвечать на запросы.
  • Компоненты Swing должны быть доступны в разделе "Диспетчер событий" только.

Эти ограничения означают, что GUI приложение с интенсивным временем для вычисления требуется как минимум два потока: 1) нить для выполнения длинных задание и 2) Тема события Dispatch (EDT) для всех видов деятельности, связанных с GUI. Это включает в себя межпоточные связь, которая может быть сложной реализовать.

SwingWorker предназначен для ситуаций где вам нужно долго работать задача выполняется в фоновом потоке и предоставлять обновления для пользовательского интерфейса, когда или во время обработки. Подклассы SwingWorker должен реализовать doInBackground() для выполнения фоновое вычисление.

Конечно, вы можете сделать это с помощью Thread, Runtime и SwingUtilities (invokeLater), но это проще и, вероятно, меньше подвержено ошибкам с использованием класса SwingWorker.

Ответ 3

SwingWorker заботится о некоторых деталях, таких как обновления пользовательского интерфейса во время выполнения задачи, или после завершения задачи. Они должны выполняться в потоке Swing EDT. Вы можете сделать это сами, но слишком легко сделать это неправильно.

Ответ 4

SwingWorker инкапсулирует правильное взаимодействие с потоком диспетчеризации событий. Runnable не работает.