|
ExecutorService: как дождаться нормального завершения всех потоков?
|
|||
---|---|---|---|
#18+
Всем привет! Как дождаться нормального завершения всех потоков и только потом разорвать соединение? В текущем примере jmsSender.disconnect() срабатывает, не дожидаясь завершения потоков. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2019, 15:43 |
|
ExecutorService: как дождаться нормального завершения всех потоков?
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2019, 16:01 |
|
ExecutorService: как дождаться нормального завершения всех потоков?
|
|||
---|---|---|---|
#18+
Molasar... while (!executor.isShutdown()) { } ... Увидев такое, тут же хочется вспомнить слова из "великого и могучего" русского языка и закрыть тему. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2019, 16:25 |
|
ExecutorService: как дождаться нормального завершения всех потоков?
|
|||
---|---|---|---|
#18+
Вот тут стандартный пример есть https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html как правильно тушить ExecutorService. Только весь прикладной код что выше написан скорее всего неправильный. В нем есть race conditions. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2019, 16:58 |
|
ExecutorService: как дождаться нормального завершения всех потоков?
|
|||
---|---|---|---|
#18+
Спасибо за идею! В итоге получилось: Код: java 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2019, 17:04 |
|
ExecutorService: как дождаться нормального завершения всех потоков?
|
|||
---|---|---|---|
#18+
Что получилось? Твои JmsProducer-ы что-то хоть сделали? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2019, 17:09 |
|
ExecutorService: как дождаться нормального завершения всех потоков?
|
|||
---|---|---|---|
#18+
maytonВот тут стандартный пример есть https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html как правильно тушить ExecutorService. Только весь прикладной код что выше написан скорее всего неправильный. В нем есть race conditions. Очень интересно ваше мнение по поводу race conditions. Несколько потоков (JmsProducer) кидают в очередь ActiveMQ объекты Event, использую одно подключение - JmsSender. Каждый созданный класс JmsProducer implements Runnable: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
class JmsSender - синглтон: Код: java 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2019, 17:15 |
|
ExecutorService: как дождаться нормального завершения всех потоков?
|
|||
---|---|---|---|
#18+
maytonЧто получилось? Твои JmsProducer-ы что-то хоть сделали? Да, всё сгенерированные сообщения были успешно поставлены в очередь. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2019, 17:26 |
|
ExecutorService: как дождаться нормального завершения всех потоков?
|
|||
---|---|---|---|
#18+
Нормально все у тебя с race conditions, точнее их нет ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2019, 17:26 |
|
ExecutorService: как дождаться нормального завершения всех потоков?
|
|||
---|---|---|---|
#18+
Не нравится мне такая практика. Давайте вычитаем как работает ::shutdown(). Мне кажется есть риск что мы срубим на взлёте часть JmsProducer-s. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2019, 17:29 |
|
ExecutorService: как дождаться нормального завершения всех потоков?
|
|||
---|---|---|---|
#18+
Возьму документацию от восьмёрки. https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html An Executor that provides methods to manage termination and methods that can produce a Future for tracking progress of one or more asynchronous tasks. An ExecutorService can be shut down, which will cause it to reject new tasks. Two different methods are provided for shutting down an ExecutorService. The shutdown() method will allow previously submitted tasks to execute before terminating, while the shutdownNow() method prevents waiting tasks from starting and attempts to stop currently executing tasks. Upon termination, an executor has no tasks actively executing, no tasks awaiting execution, and no new tasks can be submitted. An unused ExecutorService should be shut down to allow reclamation of its resources. Method submit extends base method Executor.execute(Runnable) by creating and returning a Future that can be used to cancel execution and/or wait for completion. Methods invokeAny and invokeAll perform the most commonly useful forms of bulk execution, executing a collection of tasks and then waiting for at least one, or all, to complete. (Class ExecutorCompletionService can be used to write customized variants of these methods.) The Executors class provides factory methods for the executor services provided in this package. Хм... ну может быть. Кто уже сделал перевод и скажет заключение? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2019, 17:34 |
|
ExecutorService: как дождаться нормального завершения всех потоков?
|
|||
---|---|---|---|
#18+
maytonВозьму документацию от восьмёрки. https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html An Executor that provides methods to manage termination and methods that can produce a Future for tracking progress of one or more asynchronous tasks. An ExecutorService can be shut down, which will cause it to reject new tasks. Two different methods are provided for shutting down an ExecutorService. The shutdown() method will allow previously submitted tasks to execute before terminating, while the shutdownNow() method prevents waiting tasks from starting and attempts to stop currently executing tasks. Upon termination, an executor has no tasks actively executing, no tasks awaiting execution, and no new tasks can be submitted. An unused ExecutorService should be shut down to allow reclamation of its resources. Method submit extends base method Executor.execute(Runnable) by creating and returning a Future that can be used to cancel execution and/or wait for completion. Methods invokeAny and invokeAll perform the most commonly useful forms of bulk execution, executing a collection of tasks and then waiting for at least one, or all, to complete. (Class ExecutorCompletionService can be used to write customized variants of these methods.) The Executors class provides factory methods for the executor services provided in this package. Хм... ну может быть. Кто уже сделал перевод и скажет заключение? Т.е. shutdown может быть вызван до того, как ExecutorService запустит все JmsProducer? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2019, 17:44 |
|
ExecutorService: как дождаться нормального завершения всех потоков?
|
|||
---|---|---|---|
#18+
Вообще, в твоем случае лучше и вправду сконструировать список Callable и затем пульнуть их пачкой через invokeAll, тогда и shutdown не нужен ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2019, 18:05 |
|
ExecutorService: как дождаться нормального завершения всех потоков?
|
|||
---|---|---|---|
#18+
mayton Хм... ну может быть. Кто уже сделал перевод и скажет заключение? В данном случае все ок, но лучше работать через invokeAll ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2019, 18:07 |
|
ExecutorService: как дождаться нормального завершения всех потоков?
|
|||
---|---|---|---|
#18+
забыл никВообще, в твоем случае лучше и вправду сконструировать список Callable и затем пульнуть их пачкой через invokeAll, тогда и shutdown не нужен Фьючерс или CoundDownLatch я-бы использовал чтоб не зависеть от системного shutdown. Всё таки он больше связан с завершением работы приложения. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2019, 18:46 |
|
|
start [/forum/topic.php?fid=59&fpage=28&tid=2121336]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
51ms |
get topic data: |
39ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
others: | 229ms |
total: | 412ms |
0 / 0 |