|
|
|
Пулл потоков
|
|||
|---|---|---|---|
|
#18+
Добрый день. Есть у меня задачка такая. Есть набор команд в очереди. У команды есть проперти userId. Необходимо выполнять эти команды в несколько потоков, максимальное количество которых N, при этом для одного userId ограничение по потокам M<=N. Вот если бы не второе ограничение, то все понятно, берем ThreadPoolExecutor, переводим очередь команд в очередь Runnable и вперед. Но вот как ограничить количество потоков по userId? При чем в идеале, если уже достигнуто максимальное количество потоков по M, то чтобы не тормозить остальных userId, эти команды должны как бы временно "пропускаться"(возможно просто отщиплять их в отдельную очередь и передавать ее работающим по этому userId потокам). Понятное дело, что можно свелосипедить и сделать свой вариант пулла(к чему сейчас и склоняюсь, реализация тут вроде не особо замысловатая) Но есть ли какие более стандартные способы для решения данной задачи? Заранее благодарю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2014, 16:43 |
|
||
|
Пулл потоков
|
|||
|---|---|---|---|
|
#18+
Кастомный пулл не нужен, достаточно кастомной очереди. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2014, 21:43 |
|
||
|
Пулл потоков
|
|||
|---|---|---|---|
|
#18+
1) Кастомный раннабл, который на старте инкрементит счетчик для текущего пользователя, на завершении в finally-блоке - декрементит. 2) Своя реализация BlockingQueue, которая пропускает элементы, у которых счетчик превысил лимит конкурентных задач для пользователя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2014, 23:19 |
|
||
|
Пулл потоков
|
|||
|---|---|---|---|
|
#18+
BlazkowiczAntipich, Вот тут, вроде, похожее обсуждали. http://rsdn.ru/forum/java/5878107 Похожее, но не то. Здесь не более M задач, там не более одной. В последнем случае решений больше, и они проще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2014, 11:38 |
|
||
|
Пулл потоков
|
|||
|---|---|---|---|
|
#18+
Antipich, Если бы каждая задач занимала отдельный поток, то, вероятно, вы бы завели семафор со значением M, на старте делали бы ему acquire, а перед выходом - release. При программировании задачами, когда задаче не разрешено блокироваться, алгоритм остается тот же самый, но реализация конечно нужна специфическая. К сожалению, в стандартной библиотеке нет асинхронных аналогов популярных средств синхронизации типа семафоров, но к счастью, их легко сделать своими руками. Код: 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. Верояно, нужен еще один класс - коллекция семафоров, с методом execute, который будет извлекать userId из задачи, брать соответствующий семафор и посылать задачу ему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2014, 22:20 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=146&tid=2126022]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
33ms |
get topic data: |
7ms |
get forum data: |
1ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
| others: | 212ms |
| total: | 318ms |

| 0 / 0 |
