|
|
|
снова потоки
|
|||
|---|---|---|---|
|
#18+
Подскажите, правильно ли я делаю, дело в том, что все потоки, созданные вначале, завершаются один после другого по порядку - как я понимаю, это не есть правильно. Это потому что все потоки используют один и тоже class Creator? Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2014, 17:09 |
|
||
|
снова потоки
|
|||
|---|---|---|---|
|
#18+
Потоки в приведенном коде запускаются по очереди. Поэтому и завершаются в том же порядке. Возможно, за редким исключением. Что именно смущает? Примитивов синхронизации не замечено. CyclicBarrier позволяет приостановить все потоки и потом "отпустить" их одновременно. В этом случае вам будет проще выявить ошибки в не синхронизированого счетчика. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2014, 17:12 |
|
||
|
снова потоки
|
|||
|---|---|---|---|
|
#18+
По моему ты путаешь причину со следствием. Причина - это алгоритм. У тебя он неочевиден и непонятно что нужно сделать в конце. Сейчас сходу ответить на твой вопрос невозможно потому-что он будет неполным. Нельзя строить какие-то мнимые правила на базе огрызков кода. Синхронизировать завершения потоков не обязательно. Их результат может быть зафиксирован иным путём отличным от механизмов join (можно к примеру скинуть репортик в свой текстовый файлик). Вобщем всё зависит от задачи. А есть даже такие парадигмы программирования где считается правильным запускать "потоки камикадзе". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2014, 17:21 |
|
||
|
снова потоки
|
|||
|---|---|---|---|
|
#18+
я что имею ввиду - вначале создалась куча потоков, и все они обращаются к одному и тому же методу create() того же самого объекта - т.е. это не является узким местом? как они могут выполнять этот метод одновременно, объект же один, получается что кто-то один его выполняет, а другие ждут??? тогда это объясняет что они завершаются один за другим по очереди... или все-таки могут??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2014, 17:37 |
|
||
|
снова потоки
|
|||
|---|---|---|---|
|
#18+
rema174я что имею ввиду - вначале создалась куча потоков Нет. Потоки создаются по очереди. А не "вначале". rema174, и все они обращаются к одному и тому же методу create() того же самого объекта - т.е. это не является узким местом? Нет. У вас какое-то концептуальное непонимание потоков. Методы это поведение. Они не являются критическим ресурсом сами по себе. rema174как они могут выполнять этот метод одновременно, объект же один, получается что кто-то один его выполняет, а другие ждут??? тогда это объясняет что они завершаются один за другим по очереди... или все-таки могут??? Метод это метод. Набор инструкций для исполнения. Не важно какому объекту он пренадлежит. Потоки могут исполнять инструкции параллельно. Проблемы возникают из-за критических ресурсов - областей памяти, которые потокам приходится использовать одновременно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2014, 17:45 |
|
||
|
снова потоки
|
|||
|---|---|---|---|
|
#18+
BlazkowiczНет. Потоки создаются по очереди. А не "вначале". да, по очереди, но практически в одно и тоже время, верно? а учитывая, что приоритет у них у одинаковый, то в каком порядке они завершатся неизвестно, верно? значит если они завершаются по очереди, то что-то все-таки определяет их очередность rema174У вас какое-то концептуальное непонимание потоков. наверное, есть немного :-) BlazkowiczПроблемы возникают из-за критических ресурсов - областей памяти, которые потокам приходится использовать одновременно.переменная counter - там не показано, но она инкрементится каждый раз сразу в конце create(), получается может так совпасть, что в один и тот же момент времени разные потоки будут изменять ее, но я не заметил каких-то проблем, возможно из-за того, что она изменяется не часто... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2014, 18:24 |
|
||
|
снова потоки
|
|||
|---|---|---|---|
|
#18+
rema174значит если они завершаются по очереди, то что-то все-таки определяет их очередностьСлучайность определяет. Этот как с SQL select. Нет order by - порядок будет произвольным. Он может и, довольно часто, будет совпадать с порядком вставки записей, но нет никаких гарантий такого поведения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2014, 20:16 |
|
||
|
снова потоки
|
|||
|---|---|---|---|
|
#18+
rema174да, по очереди, но практически в одно и тоже время, верно? Нет. У вас тело потока соизмеримо со временем создания и запуска потока. rema174а учитывая, что приоритет у них у одинаковый, то в каком порядке они завершатся неизвестно, верно? значит если они завершаются по очереди, то что-то все-таки определяет их очередность В общем случае да. В частных случаях, как например в вашем, видно же что потоки выполняются и завершаются слабо конкурируя. rema174переменная counter - там не показано, но она инкрементится каждый раз сразу в конце create(), получается может так совпасть, что в один и тот же момент времени разные потоки будут изменять ее, но я не заметил каких-то проблем, возможно из-за того, что она изменяется не часто... Я никогда не видел серых лошадей. Из чего я могу сделать вывод что их не существует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2014, 21:02 |
|
||
|
снова потоки
|
|||
|---|---|---|---|
|
#18+
BlazkowiczЯ никогда не видел серых лошадей. Из чего я могу сделать вывод что их не существует. это я к тому, что похоже это тот случай, когда нужно применять модификатор volatile к полю класса ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2014, 21:39 |
|
||
|
снова потоки
|
|||
|---|---|---|---|
|
#18+
rema174, Я бы порешал ваш вопрос экспериментально - нет лучшего способа понять как что-то работает, как только не провести эксперимент. Например внутри метода, насчет которого у вас сомнения встройте рандомную задержку и посмотрите, будут ли они завершаться одновременно или нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2014, 06:52 |
|
||
|
снова потоки
|
|||
|---|---|---|---|
|
#18+
rema174это я к тому, что похоже это тот случай, когда нужно применять модификатор volatile к полю класса Нет. Это тот случай когда нужно начинать читать статьи про мониторы, семафоры, взаимоблокировки, volatile и CAS. Сейчас даже на русском этого материала как грязи. Через volatile нельзя обезопасить счетчик, так как инкремент это не атомарная операция. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.10.2014, 09:09 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=154&tid=2126370]: |
0ms |
get settings: |
9ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
50ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
| others: | 211ms |
| total: | 347ms |

| 0 / 0 |
