2014-02-20 6 views
1

Я обнаружил, что для того, чтобы поддерживать Java GUI (используя Swing), единственный способ использовать класс SwingWorker, в отличие от java.lang.Thread. Действительно ли SwingWorker - единственный способ использования многопоточных графических приложений на базе ПК? Есть ли хорошие альтернативы? Редко можно настроить класс Thread для выполнения того, что я хочу сделать, но SwingWorker обычно работает, если иногда это громоздко.Является ли SwingWorker единственным способом?

+2

Я думаю, вы должны прочитать о модели качающейся нити ... –

+0

Есть ли хорошие альтернативы? да нет проблемы с использованием простой ванильной нити или Runnable # Thread, но вывод в Swing GUI (методы, реализованные в Swing API) должен быть завернут в invokeLater(), тогда поток кода контролируется по сравнению с задними отверстиями (Future & bridge, реализованный в SwingWorkers API) в SwingWorkers – mKorbel

+1

Вы можете использовать ['ExecutorService'] (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html) для фоновых процессов , – alex2410

ответ

3

Многопоточность в приложении GUI трудно реализовать, так как может быть так много действий, которые запускают действия. Хорошее объяснение, почему это «неудачный сон» можно найти здесь Multithreaded toolkits: A failed dream.. Для решения вашей проблемы прочитайте эту статью о параллелизме в swing: Concurrency in Swing

В зависимости от вашей продолжительности действия вы можете пойти с SwingUtilities.invokeLater() или сделать SwingWorker для задач, которые занимают много времени, чтобы завершить и запустить в фоновом режиме. Вы должны использовать эти классы, иначе вы можете быть в ситуациях, когда поток блокирует все ваше приложение и может казаться невосприимчивым к пользователю.

9

SwingWorker - всего лишь тонкий удобный API около Thread. Поэтому, безусловно, можно использовать Thread без SwingWorker. Главное состоит в том, что Swing не является потокобезопасным, и любые действия, которые вы выполняете над объектами Swing, должны произойти в Thread Dispatch Thread. Это основное препятствие, и SwingWorker пытается помочь вам преодолеть это немного удобнее.

7

Альтернативой является continuation использованием EventQueue.invokeLater(), но SwingWorker имеет важные преимущества:

  • Он синхронизирует гранулированный доступ к данным совместно между собой и EDT.

  • Он предоставляет поддержку изменения свойств для индикации прогресса.

  • Он реализует интерфейс Future.

См. Также Worker Threads and SwingWorker для деталей.

2

Другим вариантом, наиболее подходящим для повторяющихся задач, является javax.swing.Timer (его также можно использовать для задач с одним выстрелом).

Смежные вопросы