|
|
|
Помоги советом про многопоточность!
|
|||
|---|---|---|---|
|
#18+
Есть задачи, скажем A,B,C,D. Нужно чтобы они выполнялись друг за другом строго в порядке A->B->-C->D, и такая последовательность в свою очередь должна выполниться скажем 100 раз. Сейчас я создаю CyclicBarrier для внешнего цикла(100 повторений), а строгий порядок следования обеспечиваю с помощью lock и condition и связывающего объекта. Насколько это правильно для рассмотренной задачи и как это сделать правильно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2012, 20:50:37 |
|
||
|
Помоги советом про многопоточность!
|
|||
|---|---|---|---|
|
#18+
А зачем многопоточтость, если одновременно ничего не выполняется? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2012, 20:56:20 |
|
||
|
Помоги советом про многопоточность!
|
|||
|---|---|---|---|
|
#18+
Мне тоже непонятно зачем многопоточность в данном контексте. Но сама задача недавно обсуждалась. Посылайте все таски в Executor.newSingleThreadExecutor(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2012, 21:02:57 |
|
||
|
Помоги советом про многопоточность!
|
|||
|---|---|---|---|
|
#18+
ЛагманА зачем многопоточтость, если одновременно ничего не выполняется? Я не очень понятно описал вопрос) Задачи A,B,C,D довольно затратные сами по себе. Желательно их выполнять параллельно. Но если рассмотреть каждую из них, то каждую из них можно поделить на две части, назовем их "начало задачи А" и "конец задачи А". Та вот "начало задачи В" должно начать выполнять только после того как выполнилось "начало задачи А". Надеюсь так понятнее. Т.е. "конец задачи А" и "начало задачи В" могут выполняться параллельно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2012, 21:03:52 |
|
||
|
Помоги советом про многопоточность!
|
|||
|---|---|---|---|
|
#18+
может инкапсулировать асихронную часть непосредственно в задаче? Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. P.S. закидайте если что, тоже интересно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2012, 21:18:41 |
|
||
|
Помоги советом про многопоточность!
|
|||
|---|---|---|---|
|
#18+
Лагман, я сейчас в каждой задаче выполняю "начало задачи" и делаю condition.await(), после прихода сигнала выполняется "конец задачи". Но мне кажется это не много криво. Если задач 2-4 то еще нормально, а если их скажем 20-40? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2012, 21:29:46 |
|
||
|
Помоги советом про многопоточность!
|
|||
|---|---|---|---|
|
#18+
А почему нельзя на отдельные таски разбить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2012, 22:01:55 |
|
||
|
Помоги советом про многопоточность!
|
|||
|---|---|---|---|
|
#18+
забыл никА почему нельзя на отдельные таски разбить? Я же не говорю что нельзя, можно конечно. Я спрашиваю как это оформить правильно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2012, 22:03:52 |
|
||
|
Помоги советом про многопоточность!
|
|||
|---|---|---|---|
|
#18+
Ну чем независимее таск тем лучше. А в чем ваша трудность? Делите А на А1 и А2, Когда заканчивается А1 посылаете А2, и тд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2012, 22:14:53 |
|
||
|
Помоги советом про многопоточность!
|
|||
|---|---|---|---|
|
#18+
забыл никНу чем независимее таск тем лучше. А в чем ваша трудность? Делите А на А1 и А2, Когда заканчивается А1 посылаете А2, и тд. Дело в том, что эта последовательность A->B->C->D циклически повторяется много раз(от 100 и более) создавать столько однотипных тасков? насколько это правильно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2012, 00:05:03 |
|
||
|
Помоги советом про многопоточность!
|
|||
|---|---|---|---|
|
#18+
rdmстрогий порядок следования обеспечиваю с помощью lock и condition и связывающего объекта.Как вариант, можно воспользоваться приоритетами потоков ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2012, 00:50:36 |
|
||
|
Помоги советом про многопоточность!
|
|||
|---|---|---|---|
|
#18+
rdmзабыл никНу чем независимее таск тем лучше. А в чем ваша трудность? Делите А на А1 и А2, Когда заканчивается А1 посылаете А2, и тд. Дело в том, что эта последовательность A->B->C->D циклически повторяется много раз(от 100 и более) создавать столько однотипных тасков? насколько это правильно? Ну а что у вас вызывает сомнение? Успешное многопоточное программирование заключается в том, чтобы основательно проработать задачу и определить какие части задачи могут выполняться параллельно а какие нет, а сколько тасков - не играет особого значения, если конечно использовать пул потоков и ExecutorService. Я так до конца и не понимаю вашу задачу, но предположим вот такой вариант. Допустим, вам нужно обработать каждую страницу гипотетического веб -сайта, допустим что эту задачу можно разбить на подзадачи, которые строго зависят одна от одной - 1) Вычитать страницу 2) Сохранить страницу в базу и получить айди страницы 3) Найти все гиперссылки на странице 4) Отфильтровать ссылки которые уже есть и опять же сохранить в базу. Пусть это будут A, B, C, D. Также предположим что у вас есть код инициализации, который каким-то образом получает 10 начальных страниц для индексации. Вы создаете 4 ExecutorService для каждого типа подзадач. Очевидно что все A могут выполняться параллельно - поэтому посылаем их в первый экзекьютор, в конце работы A он посылает таск B во второй экзекьютор, B посылает C в третий и тп, таким образом вам не нужна внешняя синхронизация и параллельность максимальна. Конечно вводить таски в одну строчку это тоже перебор, но на практике чем лучше раздробить основную задачу на мелкие обособленные задачи тем лучше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2012, 14:59:50 |
|
||
|
Помоги советом про многопоточность!
|
|||
|---|---|---|---|
|
#18+
Usmanrdmстрогий порядок следования обеспечиваю с помощью lock и condition и связывающего объекта.Как вариант, можно воспользоваться приоритетами потоков Очень стремный вариант ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2012, 15:00:18 |
|
||
|
Помоги советом про многопоточность!
|
|||
|---|---|---|---|
|
#18+
rdmзабыл никНу чем независимее таск тем лучше. А в чем ваша трудность? Делите А на А1 и А2, Когда заканчивается А1 посылаете А2, и тд. Дело в том, что эта последовательность A->B->C->D циклически повторяется много раз(от 100 и более) создавать столько однотипных тасков? насколько это правильно? Ваше возражение мне совершенно непонятно. А сейчас у вас сколько таксов? разве не 400? Ну будет 800, но как вы сказали, они довольно тяжеловесные, так что затраты на синхронизацию будут незаметны. И вообще, что вы подразумеваете под словом "таск"? Runnable под управлением Executor'a или Thread? Мне кажется, вы не перешли в систему координат параллельного программирования. Для вас задача - это нечто замкнутое с точки зрения бизнес-логики, в то время как для выявления и эксплуатации параллельности нужно выявить параллельные участки и сформулировать зависимости по данным. В результате должен получиться ациклический граф, гда каждый узел - это элементарная задача, которая дождалась входных данных, испустила из себя выходные данные и умерла. Повторять ее нет смысла, так как результат будет тот же самый. Если граф большой (или неопределенного размера), его можно генерить в процессе работы (создавать новые узлы динамически). Далее, при реализации, можно программистские объекты переиспользовать, для экономии памяти, так что один и тот же объект будет представлять разные задачи. Но это надо делать осторожно, чтобы не дай бог, объект не оказался задействован в одновременно выполняемых задачах, и понимать, что это - оптимизация, и ее надо делать в конце, когда все ясно. Преждевременная оптимизация - корень всех бед. Вы же с этой оптимизации начинаете, когда хотите повторять свой небольшой набор задач несколько раз. Неудивительно, что у вас возникают проблемы - просто потому, что вы искусственно задали себе ограничения (4 задачи по 100 раз), и спрашиваете публику, как вам в эти ограничения уложиться. А никак. Вы обрисуйте задачу как она есть, без ограничений, и мы подскажем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2012, 15:41:28 |
|
||
|
Помоги советом про многопоточность!
|
|||
|---|---|---|---|
|
#18+
rdm, я люблю велосипеды, потому сделал бы для начала так: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2012, 16:40:28 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=37972025&tid=2130894]: |
0ms |
get settings: |
10ms |
get forum list: |
22ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
57ms |
get topic data: |
17ms |
get forum data: |
4ms |
get page messages: |
68ms |
get tp. blocked users: |
2ms |
| others: | 298ms |
| total: | 488ms |

| 0 / 0 |
