Почему SwingWorker?Почему не просто Thread или Runnable? - PullRequest
15 голосов
/ 23 декабря 2010

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

Ответы [ 4 ]

14 голосов
/ 23 декабря 2010

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

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

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

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

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

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

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

12 голосов
/ 23 декабря 2010

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

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

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

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

12 голосов
/ 23 декабря 2010

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

6 голосов
/ 24 декабря 2010

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

...