2012-04-23 3 views
4

Я использую качели, и в моем приложении мне нужно было запускать много потоков параллельно, проверяя подключение к интернету через каждые 5 секунд, отслеживая изменения файловой системы, sycing файлы с сервера.Несколько SwingWorkers с ExecuterService не работают должным образом

Все трудоемкие задачи, подобные приведенным выше, работают в SwingWorker так, чтобы мой графический интерфейс не замерзал.

В то же время мне нужно выполнить некоторые другие трудоемкие задачи, такие как загрузка файла на сервер. для этой цели я также использовал swingWorker. а затем я отправляю всех этих swingworker в executerService для объединения потоков, чтобы они не влияли друг на друга.

Служба моего экстерьера - вот так. Я думал, что для меня будет достаточно 30 потоков.

static ExecutorService threadExecutor; 
threadExecutor = Executors.newFixedThreadPool(30); 

, а затем я представляю темы в той же службе.

threadExecutor.submit(monitorinternetconnectivity); //submitting swingworker obejct 

Некоторые из нитей я представить в начале и некоторые я добавить время выполнения, когда я добавить во время выполнения, он не завершает работу или прервать выполнение своей работы, как контроль доступа к Интернету.

Есть ли способ иметь такую ​​же функциональность, как и рабочий качели, или лучший способ использовать несколько swingworker. и мы должны иметь возможность добавлять новые swingwokers во время выполнения для executer службы

+1

Я не понимаю, почему вы делегировали выполнение «SwingWorker» в «ExecutorService». «SwingWorker» не будет блокировать текущий поток, так как он будет выполнять всю свою работу в фоновом потоке до тех пор, пока это не будет выполнено. Когда это будет сделано, задача будет выполнена в EDT. – user1329572

+0

'ExecutorService' является неправильным инструментом, если задание является постоянной задачей. Долгосрочная задача нуждается в собственном потоке, и это не выгодно для пула потоков, за исключением того, что в конечном итоге вы ставите задачи, ожидающие очереди, потому что все потоки в пуле заняты выполнением текущих задач. –

+0

Последнее, что я проверил из собственного эксперимента, SwingWorkers использует ограниченный пул потоков из 10 потоков. Я не знаю, является ли это общим правилом, но вам было бы легко написать тестовую программу, чтобы узнать, что вы придумали в своей среде. –

ответ

1
  1. SwingWorker использует свою собственную ThreadPool.
  2. SwingWorker следует использовать для выполнения долгого задания после (то есть всего, что требуется более чем на пару миллисекунд), после чего требуется обновление графического интерфейса пользователя.
  3. Нет вызовов для обновления элементов графического интерфейса вне EDT должно быть сделано (т.е. от метода SwingWorker.done())

Если вы обычно следуют правилам доступа компонентов Swing, образуют внутри EDT (смотрите here) то у вас не должно быть проблем с блокировкой. Я подозреваю, что проблема скорее в вашем коде, а в том, что мы должны это увидеть.

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