|
|
|
Как отследить завершение всех потоков
|
|||
|---|---|---|---|
|
#18+
Приветствую. Использую класс наследованный от Runnable для создание потоков. Запуск через кнопку. После запуска кнопка становится неактивной. После выполнения всех потоков требуется сделать ее активной. Как отследить завершение всех потоков? Или может посоветуете более продвинутый класс для работы с потоками? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2016, 09:45 |
|
||
|
Как отследить завершение всех потоков
|
|||
|---|---|---|---|
|
#18+
saxixИспользую класс наследованный от Runnable для создание потоков. Начинаем с заблуждения. Runnable, так же как и Callable это не "создание потоков". Это реализация определенной задачи, которую вы можете выполнять в разных потоках. Научитесь отделять поток от самой задачи, которую он выполняет. saxixЗапуск через кнопку. После запуска кнопка становится неактивной. Swing? saxixПосле выполнения всех потоков требуется сделать ее активной. Что мешает? saxixКак отследить завершение всех потоков? Ну, если в лоб, то дописать в конце каждого метода run() некий, код. Когда все методы его выполнят, запустить событие активации кнопки. Это может быть атомарный счетчик, при запуске задачи вы его инкрементируете, при завершении, соответственно декрементируете. При обнулении, выполняете нужный вам код. По-хорошему, конечно, надо открыть для себя ExecutorService и Future. saxixИли может посоветуете более продвинутый класс для работы с потоками? SwingWorker либо аналогичный класс для вашего GUI фреймверка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2016, 10:13 |
|
||
|
Как отследить завершение всех потоков
|
|||
|---|---|---|---|
|
#18+
saxix, Что за поток что кнопка не отжалась? Или это фича свинга? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2016, 10:17 |
|
||
|
Как отследить завершение всех потоков
|
|||
|---|---|---|---|
|
#18+
Petro123saxix, Что за поток что кнопка не отжалась? Или это фича свинга? Я не писал что она не отжалась. Стормозил малость. Подумал что фокус с атомарным счетчиком не пройдет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2016, 10:50 |
|
||
|
Как отследить завершение всех потоков
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, попробую ServiceExecutor ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2016, 10:51 |
|
||
|
Как отследить завершение всех потоков
|
|||
|---|---|---|---|
|
#18+
saxixпопробую ServiceExecutor Ну, изобретете свой SwingWorker в итоге. Так почему бы не взять готовый? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2016, 11:00 |
|
||
|
Как отследить завершение всех потоков
|
|||
|---|---|---|---|
|
#18+
saxixЯ не писал что она не отжалась. Стормозил малость. Подумал что фокус с атомарным счетчиком не пройдет. Кстати, в JUC есть такой класс. https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html Проблема только в том, что в GUI нужно не ждать пока что-то закончится, а правильно обрабатывать синхронные колбэки. Поэтому большинство JUC классов не особо полезны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2016, 11:07 |
|
||
|
Как отследить завершение всех потоков
|
|||
|---|---|---|---|
|
#18+
Если Java 8, то можно воспользоваться CompletableFuture Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2016, 11:21 |
|
||
|
Как отследить завершение всех потоков
|
|||
|---|---|---|---|
|
#18+
Blazkowiczsaxixпопробую ServiceExecutor Ну, изобретете свой SwingWorker в итоге. Так почему бы не взять готовый? Пытаюсь проанализировать, с чем быстрее реализовать с учетом времени на изучение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2016, 11:23 |
|
||
|
Как отследить завершение всех потоков
|
|||
|---|---|---|---|
|
#18+
WGAЕсли Java 8, то можно воспользоваться CompletableFuture Код: java 1. 2. С тем же успехом можно и в цикле по обычным Future блокироваться. Проблема GUI в другом. EDT блокировать нельзя. Вообще у меня есть ещё одно решение в лоб. Можно создать новый поток, на него заджоинить все остальные, а в нём просто пульнуть событие в EventQueue. Но это всё равно коряво. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2016, 11:33 |
|
||
|
Как отследить завершение всех потоков
|
|||
|---|---|---|---|
|
#18+
saxixПытаюсь проанализировать, с чем быстрее реализовать с учетом времени на изучение Покажите что ли код. Потому как концептуально архитектурно нужно вообще всё иначе делать. Потоки выполняют некую задачу и обновляют модель уже в EDT через SwingWorker. И это уже задача модели определить все ли данные готовы. Задачу как бы от потоков нужно вообще абстрагировать. Не важно ведь сколько там потоков один, или десять, важно, то готова ли модель к тому чтобы активировать кнопку или нет. Поэтому все извращения с JUC для архитектуры GUI только во вред. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2016, 11:36 |
|
||
|
Как отследить завершение всех потоков
|
|||
|---|---|---|---|
|
#18+
В общем случае можно сделать некую шину и два события на ней. Кнопка подписывается на события. И при аттачменте посылает первое событие, по которому шедулер отвечает в шину сообщением второго типа с текущим состоянием. Шедулер так же потоков пуляет второе сообщение и по изменению своего состояния. Таким образом имеем разное количество кнопок, которые переключают свою доступность по состоянию шедулера. В таком примитивном варианте несложно делается самим на примитивах, но можно и стандартными методами. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2016, 11:43 |
|
||
|
Как отследить завершение всех потоков
|
|||
|---|---|---|---|
|
#18+
BlazkowiczsaxixПытаюсь проанализировать, с чем быстрее реализовать с учетом времени на изучение Покажите что ли код. Потому как концептуально архитектурно нужно вообще всё иначе делать. Потоки выполняют некую задачу и обновляют модель уже в EDT через SwingWorker. И это уже задача модели определить все ли данные готовы. Задачу как бы от потоков нужно вообще абстрагировать. Не важно ведь сколько там потоков один, или десять, важно, то готова ли модель к тому чтобы активировать кнопку или нет. Поэтому все извращения с JUC для архитектуры GUI только во вред. Да я только тестовый накидал, и то уже поправил на ServiceExecutor. Так сказать - пытаюсь понять что написал. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2016, 12:09 |
|
||
|
Как отследить завершение всех потоков
|
|||
|---|---|---|---|
|
#18+
saxix Код: java 1. 2. Это вообще не то. Здесь должно быть Код: java 1. 2. 3. Но, оно для GUI всё равно не подходит, потому что блокирует EDT в обоих случаях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2016, 12:23 |
|
||
|
Как отследить завершение всех потоков
|
|||
|---|---|---|---|
|
#18+
Blazkowiczsaxix Код: java 1. 2. Это вообще не то. Здесь должно быть Код: java 1. 2. 3. Перед отправкой поменял. BlazkowiczНо, оно для GUI всё равно не подходит, потому что блокирует EDT в обоих случаях Что это значит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2016, 12:26 |
|
||
|
Как отследить завершение всех потоков
|
|||
|---|---|---|---|
|
#18+
saxixЧто это значит? Это значит что в момент, когда вы будете ждать завершения потоков, вы блокируете текущий поток. А текущий поток это Event Dispatch Thread, на котором работает GUI. Блокировка этого потока приводит к блокировке всего UI и никакого профита от многопоточности не будет. Вы пример разве не запускали? Фриза на секунду разве нет? Обычно после такого сразу начинаются жалобы "Swing тормозит". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2016, 12:31 |
|
||
|
Как отследить завершение всех потоков
|
|||
|---|---|---|---|
|
#18+
BlazkowiczsaxixЧто это значит? Это значит что в момент, когда вы будете ждать завершения потоков, вы блокируете текущий поток. А текущий поток это Event Dispatch Thread, на котором работает GUI. Блокировка этого потока приводит к блокировке всего UI и никакого профита от многопоточности не будет. Вы пример разве не запускали? Фриза на секунду разве нет? Обычно после такого сразу начинаются жалобы "Swing тормозит". Тормозов, если честно, не заметил. Формочка свободно перетаскивается по экрану ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2016, 12:33 |
|
||
|
Как отследить завершение всех потоков
|
|||
|---|---|---|---|
|
#18+
saxix, К вашей проблеме сложно дать правильный совет, потому что с одной стороны у вас GUI, а с другой стороны, вроде как GUI вам особо не нужен, вы пытаетесь проблему запуска решить. Правильность решения сильно зависит от того зачем мы запускаем именно несколько фоновых задач. Можно запустить 1 SwingWorker на каждую задачу. Можно запустить 1 SwingWorker для все задачи, а внутри doInBackground уже запускать фоновые задачи. Там же и заблокировать SwingWorker ожидая их завершения. Может вообще нужен ForkJoinPool, если результат фоновых задач нужно собрать воедино. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2016, 12:37 |
|
||
|
Как отследить завершение всех потоков
|
|||
|---|---|---|---|
|
#18+
Blazkowiczsaxix, К вашей проблеме сложно дать правильный совет, потому что с одной стороны у вас GUI, а с другой стороны, вроде как GUI вам особо не нужен, вы пытаетесь проблему запуска решить. Правильность решения сильно зависит от того зачем мы запускаем именно несколько фоновых задач. Можно запустить 1 SwingWorker на каждую задачу. Можно запустить 1 SwingWorker для все задачи, а внутри doInBackground уже запускать фоновые задачи. Там же и заблокировать SwingWorker ожидая их завершения. Может вообще нужен ForkJoinPool, если результат фоновых задач нужно собрать воедино. Могу только послушать Вашего совета. Попробую реализовать второй вариант ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2016, 12:39 |
|
||
|
Как отследить завершение всех потоков
|
|||
|---|---|---|---|
|
#18+
saxix, И ещё не понятно, с одной стороны у вас Java 8, с другой стороны ни лямбд, ни Diamond Operator я не вижу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2016, 12:41 |
|
||
|
Как отследить завершение всех потоков
|
|||
|---|---|---|---|
|
#18+
saxixТормозов, если честно, не заметил. Формочка свободно перетаскивается по экрану Двигает окно операционка. Swing это событие лишь слушает. Попробуйте изменить размер окна. Попробуйте добавить текстовое поле и вбивать в него текст во время процесса. В конце концов, добавьте JProgressBar, тогда-то косяки и полезут наружу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2016, 12:44 |
|
||
|
Как отследить завершение всех потоков
|
|||
|---|---|---|---|
|
#18+
Blazkowiczsaxix, И ещё не понятно, с одной стороны у вас Java 8, с другой стороны ни лямбд, ни Diamond Operator я не вижу. Использование 8-ки не обязательное ж условие на использование лямбд. Могу и переделать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2016, 12:48 |
|
||
|
Как отследить завершение всех потоков
|
|||
|---|---|---|---|
|
#18+
Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. В идеале, конечно, то что в Main тоже должно быть отдельным классом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2016, 13:13 |
|
||
|
Как отследить завершение всех потоков
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, попытался переделать под свои нужды, упростил Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2016, 16:41 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39192214&tid=2124275]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
145ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 251ms |
| total: | 485ms |

| 0 / 0 |
