![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
SoulKeeper |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 375 Регистрация: 14.1.2007 Где: Ukraine, Lviv. Репутация: 11 Всего: 15 |
Всем привет, собственно игрался я на досуге с построением эффективной модели многопоточности для своего приложения, наткнулся на подводные камни.
Вкратце описание задачи. Есть NIO сервер, крутится себе в своем потоке, общается с клиентами. Есть клиенты, которые передают запросы на выполнение. Запросы, естественно, не выполняются в потоке Selector"а, а передаются на выполнение ThreadPoolExecutor"ам. Есть одно ограничение: Запросы клиента должны выполняться последовательно для клиента, т.е. вот такое является нормальным ходом выполнения. к = клиент, з = запрос. к1з1, к2з1, к3з1, к3з2, к1з2, к1з3, к2з2... Запросы поступают не сразу. Между ними может пройти какое-то время. В общем картина такова, что клиентам между собой синхронизация не нужна, а запросы от клиентов должны выполняться последовательно, по мере поступления относительно клиента. Как вариант - можно все это дело запихнуть в 1 поток, но не нравится оно мне ![]() Суть проблемы в том что некоторые передаваемые на выполнение Runnable просто игнорируются, а RejectedExecutionhandler"ы молчат :( P.S. BlockingThreadFactory - это я смотрел насколько выгодно ограничивать количество параллельных тридов. Как оказалось - не выгодно, общее време выполнения увеличивалось. Во всяком случае в даном примере.
|
||||||
|
|||||||
ivg |
|
|||
![]() Autonomous R&D ![]() ![]() Профиль Группа: Участник Сообщений: 686 Регистрация: 8.2.2006 Где: Екатеринбург Репутация: 33 Всего: 81 |
||||
|
||||
SoulKeeper |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 375 Регистрация: 14.1.2007 Где: Ukraine, Lviv. Репутация: 11 Всего: 15 |
Thx!
![]() Я что-то думал что примитивы не страдают от возможных проблем с синхронизацией... Как оказалось - страдают. |
|||
|
||||
Дрон |
|
||||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 6 Всего: 92 |
Примитивы "страдают" от кэширования в рабочей памяти потока. Попробуй объявить счётчик вот так:
Хотя synchronized -- более общее решение. Это сообщение отредактировал(а) Дрон - 30.6.2008, 15:39 -------------------- Да. Именно так. |
||||
|
|||||
SoulKeeper |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 375 Регистрация: 14.1.2007 Где: Ukraine, Lviv. Репутация: 11 Всего: 15 |
volatile не помогает |
||||
|
|||||
ivg |
|
|||
![]() Autonomous R&D ![]() ![]() Профиль Группа: Участник Сообщений: 686 Регистрация: 8.2.2006 Где: Екатеринбург Репутация: 33 Всего: 81 |
synchronized - чтобы понять проблему, а вообще можно например java.util.concurrent.atomic.AtomicInteger
|
|||
|
||||
Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 6 Всего: 92 |
Странно, ну видимо есть ещё какие-то тонкости. Я в детали твоего кода не вникал ![]() -------------------- Да. Именно так. |
|||
|
||||
SoulKeeper |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 375 Регистрация: 14.1.2007 Где: Ukraine, Lviv. Репутация: 11 Всего: 15 |
Еше раз thx ![]() ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |