У меня есть многопоточная реализация, где я создаю ExecutorService и отправляю выполняемые задачи, я хочу знать, когда все потоки отправлены, завершились без блокировки основного потока и пользовательского интерфейса. Я пробовал ExecutorService.awaitTermination()
, но он блокирует основной поток и пользовательский интерфейс. Я искал много, но я не могу найти элегантный способ сделать это. Я сейчас думаю о создании другого потока, который подсчитывает количество завершенных потоков и запускает событие, когда все закончится, но это не очень хороший подход, и мне нужно лучшее решение!ExecutorService, как узнать, когда все потоки закончены без блокировки основного потока?
ответ
isTerminated()
будет делать
к сведению, однако, что оба awaitTermination
и isTerminated
только даст вам значимый результат после того, как вы назвали shutdown
Я нашел кое-что о isTerminated(), но все же, я думаю, мне нужно запустить его на «боковом потоке», чтобы постоянно проверять, возвращает ли он true, что приводит меня к моему первоначальному решению! – Trota
Использовать SwingWorker
для отключения пула потоков и вызвать awaitTermination()
. Это предотвратит блокировку пользовательского интерфейса и вызовет done()
из потока отправки событий в вашей реализации SwingWorker, который вы можете использовать для запуска любых изменений пользовательского интерфейса, которые вам нужны.
Если вы хотите отслеживать потоки, выполняемые с помощью обновления пользовательского интерфейса, вы можете использовать рабочий поток, чтобы отслеживать это в цикле и вызывать publish()
с аргументами, которые затем передаются в вашу реализацию process()
на EDT.
Почему бы не использовать CountDownLatch, а затем уведомить основной поток, когда защелка выполнена.
Вы можете создать отдельный поток для отслеживания, когда экземпляр службы исполнитель выключается:
final ExecutorService execSvc = ...;
execSvc.submit(task1);
...
execSvc.submit(taskN);
// important to request the exec service to shut down :)
execSvc.shutdown();
new Thread(new Runnable() {
public void run() {
while (!execSvc.isTerminated()) {
try {
execSvc.awaitTermination(60, TimeUnit.SECONDS);
} catch (InterruptedException e) {
// ignore exception
}
}
System.out.println("ExecSvc.run: exec service has terminated!");
// possibly submit a task using SwingUtilities.invokeLater() to update the UI
}
}).start();
Использование CountDownLatch
CountDownLatch latch = new CountDownLatch(totalNumberOfTasks); ExecutorService taskExecutor = Executors.newFixedThreadPool(4); while(...) { taskExecutor.execute(new MyTask()); } try { latch.await(); } catch (InterruptedException E) { // handle }
и в пределах вашей задачи (вложить в попытке /, наконец)
latch.countDown();
Или на ExecutorService вы вызываете shutdown(), а затем awa itTermination()
ExecutorService taskExecutor = Executors.newFixedThreadPool(4); while(...) { taskExecutor.execute(new MyTask()); } taskExecutor.shutdown(); try { taskExecutor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); } catch (InterruptedException e) { ... }
Кроме того, есть взгляд на THIS ответ
Если я не ошибаюсь в своем понимании, ни одно из этих решений не затрагивает фундаментальный вопрос OP, который заключается в том, чтобы избежать блокировки основного нить. – Trevor
- 1. Как узнать, когда все потоки в ExecutorService закончены?
- 2. Тайм-аут для ExecutorService без блокировки основного потока
- 3. Как добавить SCNNodes без блокировки основного потока?
- 4. Как обновить main {}, когда потоки закончены?
- 5. Как я узнать, что все потоки в ExecutorService завершили выполнение
- 6. запроса MVC Ajax без блокировки основного потока
- 7. Как выйти из программы, когда все потоки закончены?
- 8. Возвращаемое значение из потока в python без блокировки основного потока
- 9. Выполнить действие, когда все потоки в основном не закончены? (Python)
- 10. Групповые потоки в ExecutorService
- 11. Как определить, когда все методы закончены?
- 12. Как вы называете GetMapAsync в xamarin без блокировки основного потока?
- 13. Как диалоги предотвращают выполнение кода без блокировки основного потока?
- 14. Есть ли способ узнать, успешно ли ExecutorService?
- 15. Как вернуть async HttpWebResponse без блокировки основного потока?
- 16. Как прервать потоки ExecutorService
- 17. Как создать большое количество элементов управления без блокировки основного потока?
- 18. Безопасность потока без блокировки
- 19. предотвратить QApplication :: exec из блокировки основного потока
- 20. Изящно завершайся, когда все рабочие закончены
- 21. преобразование блокировки потока для блокировки без потока в f #
- 22. Как узнать, когда протрактор/жасмин закончены? (Логика инструмента отчетности)
- 23. Как узнать, когда MKMapView и видимый MKAnnotationView закончены?
- 24. Как узнать, когда сделаны два потока?
- 25. Чтение потока json без блокировки
- 26. Как вы ограничиваете потоки в ExecutorService?
- 27. Как я могу убедиться, что все потоки закончились до окончания основного потока?
- 28. Как приостановить/возобновить все потоки в ExecutorService в Java?
- 29. Как прекратить потоки Producer-Consumer из основного потока в Python?
- 30. Как узнать, выполняется ли goroutine без блокировки?
Ваш главный поток делает, что он не может быть заблокирован? – EJP
Какой инструмент пользовательского интерфейса вы используете? – Dev