|
|
|
JavaFX: действия при старте и завершении потоков.
|
|||
|---|---|---|---|
|
#18+
Как-то уже задавал тут вопрос о том, как вообще определяется, что все работающие Service завершились, но ответа не получил :) Вопрос тогда звучал так: Возник вопрос: а как вообще по-правильному определять, что все потоки (task'и или service'ы) завершились ? Самый простой пример: при открытии формы показываем пользователю либо анимированную картинку, либо выводим надпись "Ждите, загрузка..." и одновременно с этим запускаем несколько фоновых задач. По их окончанию надо надпись\картинку убрать, а как определять, что все задачи завершились ? В мой нубский ум приходит только одна мысль - это создание доп. класса, который бы принимал в конструктор кол-во запущенных потоков, а каждый из запущенных потоков при завершении увеличивал бы некую переменную на единицу. И соответственно когда эта переменная становилось бы равной количеству потоков, то выполнялись бы необходимые действия. В общем возникла все-таки необходимость все это реализовать, и получился такой вот класс. Посмотрите пожалуйста, насколько все это жизнеспособно и корректно сделано. Заранее благодарю! Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2014, 13:10 |
|
||
|
JavaFX: действия при старте и завершении потоков.
|
|||
|---|---|---|---|
|
#18+
korshunКак-то уже задавал тут вопрос о том, как вообще определяется, что все работающие Service завершились, но ответа не получил :) Вы зациклились на JavaFX API, игнорируя при этом j.c.u. Зачем брать именно Service для этой проблемы? Используйте Task.get() в итераторе. Вроде, классический пример. Зачем что-то изобретать? korshunВ мой нубский ум приходит только одна мысль - это создание доп. класса, который бы принимал в конструктор кол-во запущенных потоков, а каждый из запущенных потоков при завершении увеличивал бы некую переменную на единицу. И соответственно когда эта переменная становилось бы равной количеству потоков, то выполнялись бы необходимые действия. Можно и так. У меня так сделано в Swing, но немного для другой задачи. Просто это сложнее. А зачем усложнять, если есть решение проще? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2014, 13:26 |
|
||
|
JavaFX: действия при старте и завершении потоков.
|
|||
|---|---|---|---|
|
#18+
korshun Код: java 1. 2. 3. 4. 5. REALLY? Фраза "атомарная операция" вам о чем-либо говорит? Возможно метод должен вызываться только из EDT? Тогда нужно в нем явную проверку реализовать и выкидывать исключение для других потоков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2014, 13:29 |
|
||
|
JavaFX: действия при старте и завершении потоков.
|
|||
|---|---|---|---|
|
#18+
BlazkowiczREALLY? Фраза "атомарная операция" вам о чем-либо говорит? Возможно метод должен вызываться только из EDT? Тогда нужно в нем явную проверку реализовать и выкидывать исключение для других потоков. А что не так ? Можно чуток подробнее для чайников ?:) Ибо например здесь пишут следующее: volatile проще, нежели синхронизация и подходит только для контроля доступа к одиночному экземпляру или переменной примитивного типа: int, boolean... Когда переменная объявлена как volatile, любая запись её будет осуществляться прямо в память, минуя кеш. Также как и считываться будет прямо из памяти, а не из всевозможного кеша. Это значит, что все потоки будут "видеть" одно и то же значение переменной одновременно. BlazkowiczЗачем брать именно Service для этой проблемы? Так если мне нужно "считать" потоки множество раз, то предположил, что лучше юзать Service, чем каждый раз создавать новый Task, разве нет ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2014, 13:47 |
|
||
|
JavaFX: действия при старте и завершении потоков.
|
|||
|---|---|---|---|
|
#18+
korshunА что не так ? Можно чуток подробнее для чайников ?:) Подробнее? Гугл - "атомарные операции". Два потока читают переменную - видят там 0. Увеличивают на 1. Записывают в переменную 1. Два потока отработали. А в переменной 1. korshunИбо например здесь пишут следующее: Ну, если один поток увидел 0, то и второй поток увидел 0. Всё честно. На инкремент это как должно влиять? korshunТак если мне нужно "считать" потоки множество раз, то предположил, что лучше юзать Service, чем каждый раз создавать новый Task, разве нет ? Каша в термнологии и в постановке задачи. Вот написано: "как вообще определяется, что все работающие Service завершились" Да, никак. Потому что работают и завершаются Task-и. А Service это лишь инструмент для работы с ними. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2014, 13:56 |
|
||
|
JavaFX: действия при старте и завершении потоков.
|
|||
|---|---|---|---|
|
#18+
BlazkowiczПодробнее? Гугл - "атомарные операции". Два потока читают переменную - видят там 0. Увеличивают на 1. Записывают в переменную 1. Два потока отработали. А в переменной 1. Угу, уже дошло до меня в чем ошибка, спасибо. Подскажите тогда пожалуйста, как правильно инкрементить volatile переменную, в интернетах что-то примеры найти не могу :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2014, 14:22 |
|
||
|
JavaFX: действия при старте и завершении потоков.
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2014, 14:25 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38683748&tid=2126972]: |
0ms |
get settings: |
7ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
195ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
| others: | 229ms |
| total: | 513ms |

| 0 / 0 |
