![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
Platon |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1801 Регистрация: 25.4.2006 Репутация: 16 Всего: 40 |
Здравствуйте, уважаемые.
Давно я не занимался потоками, освежить память своими силами не удалось. Проблема возникла в следующем коде:
запускаю таким образом:
Картина на выходе
Выделил характерную ситуацию. Поток-0 успевает сообщить о том, что собирается освободить блок в методе jobDone() и успевает сразу занять его в методе process(), благополучно преодолеть его, плюсануть число активных потоков и дальше идёт процесс. В чём дело, КЭП? |
||||||
|
|||||||
Platon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1801 Регистрация: 25.4.2006 Репутация: 16 Всего: 40 |
Маленькое уточнение, если поставить задержку после метода manager.jobDone(); то потоки успевают перехватить монитор.
|
|||
|
||||
_sten_ |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 184 Регистрация: 29.9.2006 Репутация: нет Всего: 3 |
а можно поподробней что именно происходит не так как ожидалось?
--------------------
WARNING: Condition 'to_be || !to_be' is always 'true' ! |
|||
|
||||
Platon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1801 Регистрация: 25.4.2006 Репутация: 16 Всего: 40 |
Хотелось бы, чтобы не только один поток выполнял всю работу. Возможно, всё идёт так как надо, но складывается впечатление, что код написан неверно. Я ожидал, что потоки будут поочерёдно выполнять работу. Выйти из метода jobDone, успеть войти в метод process и захватить монитор... Это похоже на ситуацию, когда футболист пинает мяч, бежит за ним, опережает его и принимает. |
|||
|
||||
priam220 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 4.6.2010 Репутация: 7 Всего: 8 |
У тебя получается, что один какой-то процесс привелегированный, потому как threads для него равен нулю и он в цикл с wait не попадает и обгоняет все остальные в несколько раз из за этого.
Мне кажется, это вполне нормально, в том смысле что какая разница какой поток будет выполнять работу, этот или тот. Если этот свободен - пусть делает. Быстрее ведь не будет, наоборот. Если принципиально надо что бы они все трудились, - то надо менять условие в process() while. Но в реалии код обрастет мясом, и потоки будут успевать просыпаться и занимать очередь у монитора. Так что мое мнение - все ок. Кстати notify не гарантирует, что будет выбран другой поток, так что в любом случае, такое поведение нельзя будет исключить. Это сообщение отредактировал(а) priam220 - 10.1.2011, 22:08 |
|||
|
||||
priam220 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 4.6.2010 Репутация: 7 Всего: 8 |
Platon, кстати а зачем вы используете while? Мне кажется его лучше заменить на if. И картина сразу меняется в лучшую сторону:
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "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. |