Я обнаружил, что для того, чтобы поддерживать Java GUI (используя Swing), единственный способ использовать класс SwingWorker, в отличие от java.lang.Thread. Действительно ли SwingWorker - единственный способ использования многопоточных графических приложений на базе ПК? Есть ли хорошие альтернативы? Редко можно настроить класс Thread для выполнения того, что я хочу сделать, но SwingWorker обычно работает, если иногда это громоздко.Является ли SwingWorker единственным способом?
ответ
Многопоточность в приложении GUI трудно реализовать, так как может быть так много действий, которые запускают действия. Хорошее объяснение, почему это «неудачный сон» можно найти здесь Multithreaded toolkits: A failed dream.. Для решения вашей проблемы прочитайте эту статью о параллелизме в swing: Concurrency in Swing
В зависимости от вашей продолжительности действия вы можете пойти с SwingUtilities.invokeLater() или сделать SwingWorker для задач, которые занимают много времени, чтобы завершить и запустить в фоновом режиме. Вы должны использовать эти классы, иначе вы можете быть в ситуациях, когда поток блокирует все ваше приложение и может казаться невосприимчивым к пользователю.
SwingWorker
- всего лишь тонкий удобный API около Thread
. Поэтому, безусловно, можно использовать Thread
без SwingWorker
. Главное состоит в том, что Swing не является потокобезопасным, и любые действия, которые вы выполняете над объектами Swing, должны произойти в Thread Dispatch Thread. Это основное препятствие, и SwingWorker
пытается помочь вам преодолеть это немного удобнее.
Альтернативой является continuation использованием EventQueue.invokeLater()
, но SwingWorker
имеет важные преимущества:
Он синхронизирует гранулированный доступ к данным совместно между собой и EDT.
Он предоставляет поддержку изменения свойств для индикации прогресса.
Он реализует интерфейс
Future
.
См. Также Worker Threads and SwingWorker для деталей.
Другим вариантом, наиболее подходящим для повторяющихся задач, является javax.swing.Timer
(его также можно использовать для задач с одним выстрелом).
- 1. Является ли NSNumberFormatter единственным способом форматирования NSDecimalNumber?
- 2. Является ли rtmp единственным способом защиты изображений
- 3. Подпроцесс является единственным способом обеспечения ввода ввода()?
- 4. Является событием единственным способом обмена между портлетами
- 5. Является ли Appdomain единственным способом для песочницы IronPython?
- 6. Является ли SubConic CodingHorror единственным способом делать WHERE ISNULL?
- 7. Является ли метод расширения единственным способом добавления функции в Enum?
- 8. iPhone: Является ли Quartz 2D единственным способом генерации PDF-файлов?
- 9. C++ Является ли Mutex единственным способом блокировки общих ресурсов
- 10. Является ли оболочка единственным способом проверки статической зависимости?
- 11. Является ли Dynamic SQL единственным способом запускать это?
- 12. Является ли метод clone() Java единственным способом достижения полиморфного клонирования?
- 13. Является ли iCalendar (.ics) единственным способом нажатия календарных данных?
- 14. Является ли полный клон единственным способом для подмодуля добавить ветку?
- 15. Является ли Installshield единственным способом для установки Delphi?
- 16. Является ли спецификация проектов для хобби единственным способом для них?
- 17. Является ли SMS единственным способом зарегистрироваться в Google App Engine?
- 18. Является ли медиа-запрос единственным способом поддержки нескольких размеров экрана?
- 19. Являются ли макросы единственным способом принудительного inline
- 20. На странице html является javascript единственным способом программного манипулирования DOM?
- 21. Почему Cookie является единственным способом узнать количество пользователей
- 22. В Javascript является объявлением функции единственным способом создания конструктора?
- 23. Является ли сотрудничество SwingWorker от Java?
- 24. iBeacons - Является ли Apple единственным производителем?
- 25. Является ли вариант Iframe моим единственным вариантом?
- 26. Является ли контент-провайдер единственным блокирующим экземпляром?
- 27. Являются ли геттеры и сеттеры единственным способом избежать мутаций прототипа?
- 28. Являются ли DLL единственным способом «черного ящика» вашего кода?
- 29. Являются ли получатели единственным способом предотвратить изменения публичных свойств?
- 30. Являются ли Dataatets/Datatables единственным способом возврата данных?
Я думаю, вы должны прочитать о модели качающейся нити ... –
Есть ли хорошие альтернативы? да нет проблемы с использованием простой ванильной нити или Runnable # Thread, но вывод в Swing GUI (методы, реализованные в Swing API) должен быть завернут в invokeLater(), тогда поток кода контролируется по сравнению с задними отверстиями (Future & bridge, реализованный в SwingWorkers API) в SwingWorkers – mKorbel
Вы можете использовать ['ExecutorService'] (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html) для фоновых процессов , – alex2410