|
|
|
Thread/ ReentrantLock
|
|||
|---|---|---|---|
|
#18+
Добрый вечер. Есть следующая структура класс с потоками Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ну и класс с ресурсами Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ну и класс MyThread вот такой например Код: java 1. 2. 3. 4. 5. 6. Вопрос собственно такой : может ли этот код гарантировать то, что ресурс будет захвачен поочереди потоками из " list" в том порядке в котором они находятся там. То есть сначала первый поток захватит, потом второй, потом третий и тд. И если нет, то как можно этого добиться? без использования блокирующих очередей из готовой библиотеки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2014, 18:57 |
|
||
|
Thread/ ReentrantLock
|
|||
|---|---|---|---|
|
#18+
ИМХО, если сделать Resource синглтоном , то да. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2014, 19:10 |
|
||
|
Thread/ ReentrantLock
|
|||
|---|---|---|---|
|
#18+
Спасибо =) то бишь просто поочередным запуском не обеспечивается необходимый порядок? может быть еще кто-нибудь посоветует что? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2014, 19:20 |
|
||
|
Thread/ ReentrantLock
|
|||
|---|---|---|---|
|
#18+
хотя я тут посидел прикинул и не совсем понял, как тут синглтон поможет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2014, 19:54 |
|
||
|
Thread/ ReentrantLock
|
|||
|---|---|---|---|
|
#18+
alex021И если нет, то как можно этого добиться? Код: java 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2014, 19:54 |
|
||
|
Thread/ ReentrantLock
|
|||
|---|---|---|---|
|
#18+
Usman, да, спасибо=) я тоже об жито подумал, только делал немного по другому. Код: java 1. 2. 3. 4. Но это на мой взгляд лишь, так сказать "затычка" =( качественной работы не обеспечит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2014, 20:06 |
|
||
|
Thread/ ReentrantLock
|
|||
|---|---|---|---|
|
#18+
alex021, ИМХО. Синглтон поможет тем, что у Вас для каждого потока создается свой экземпляр Resource со своим же внутренним ReentrantLock. Как вариант запихнуть ReentrantLock в статичное поле (как вариант - проверить и тд). А чтобы последовательно выполнялись: авторThe constructor for this class accepts an optional fairness parameter. When set true, under contention, locks favor granting access to the longest-waiting thread. Итого: Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2014, 20:13 |
|
||
|
Thread/ ReentrantLock
|
|||
|---|---|---|---|
|
#18+
alex021, Еще один вариант: Код: java 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2014, 20:27 |
|
||
|
Thread/ ReentrantLock
|
|||
|---|---|---|---|
|
#18+
alex021Спасибо =) то бишь просто поочередным запуском не обеспечивается необходимый порядок? может быть еще кто-нибудь посоветует что?Нет, порядок гарантирован не будет. И Thread.sleep() вам тоже никаких гарантий не даст, так как ХЗ в каком порядке они на самом деле проснуться. И ReentrantLock с fair=true вам не поможет, так как хз в каком порядке потоки встанут в очередь внутри ReentrantLock. И ExecutorService вам так же не поможет ... так как он вооб Executors.newSingleThreadExecutor() и Thread.join() - да, помогут. Но тогда весь смысл многопоточности теряется, ибо по сути у вас в бэкгрануде всегда будет только один поток. Ну и, ко всему прочему, ваш код некорректен, так как каждый поток создает свой инстанс Resource. Если хотите гарантировать порядок, то вам нужно создать какую-то явную связь между потоками. Например, у каждого потока сидит внутри поле new CountDownLatch(1). Второй поток слушает латч первого потока, третий второго, и т.д.. Потом первый поработал с ресурсом, отпустил латч, второй начал работать. Потом второй отпустил, третий начал работать, и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2014, 20:52 |
|
||
|
Thread/ ReentrantLock
|
|||
|---|---|---|---|
|
#18+
no56892, да с конструктором вроде стало работать стабольно но вот человек тут раскидал все идеи). Usman , про экзекьютор согласен, как-то не тянет на много поточность. Хотя спасибо за совет , порылся поинтересовался этим) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2014, 21:21 |
|
||
|
Thread/ ReentrantLock
|
|||
|---|---|---|---|
|
#18+
DEVcoachЕсли хотите гарантировать порядок, то вам нужно создать какую-то явную связь между потоками. Например, у каждого потока сидит внутри поле new CountDownLatch(1). Второй поток слушает латч первого потока, третий второго, и т.д.. Потом первый поработал с ресурсом, отпустил латч, второй начал работать. Потом второй отпустил, третий начал работать, и т.д. Идею я понял, но как организовать прослушку, связав потоки..эмм ..честно говоря я в тупике =( на мысль не натолкнете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2014, 21:22 |
|
||
|
Thread/ ReentrantLock
|
|||
|---|---|---|---|
|
#18+
alex021 , Не берусь утверждать, что это самое красивое, и лучшее решение, просто первое, что пришло в голову. Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2014, 22:10 |
|
||
|
Thread/ ReentrantLock
|
|||
|---|---|---|---|
|
#18+
DEVcoach alex021 , Не берусь утверждать, что это самое красивое, и лучшее решение, просто первое, что пришло в голову. [/src] спасибо! идея дошла . посидел , вроде работает =) Тема закрыта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2014, 01:53 |
|
||
|
Thread/ ReentrantLock
|
|||
|---|---|---|---|
|
#18+
alex021, а зачем тут несколько потоков если в один момент времени может выполняться только один, может лучше всё в один поток делать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2014, 11:36 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38587253&tid=2127500]: |
0ms |
get settings: |
6ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
172ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 224ms |
| total: | 493ms |

| 0 / 0 |
