Почему 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
не работает.