![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| nc30 |
|
||||||
|
Интересующийся :) ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 24.6.2010 Где: Санкт-Петербург Репутация: 5 Всего: 8 |
Главный поток в цикле порождает несколько (количество заранее неизвестно) однотипных потоков, которые должны параллельно отработать. Главный поток должен дождаться завершения порожденных и вывести результаты их работы.
Если я делаю так:
Другие варианты, которые пришли на мысль вместо использования join(): 1) Поставить после цикла while: Thread.sleep(1500). В течении этого времени порожденные потоки успевают отработать. Ненадежно. 2) Записывать порожденные потоки в коллекцию threads. Затем после окончания while:
3) Задать главному потоку более низкий приоритет, но здесь не будет 100% гарантии. Как лучше (и, желательно, проще) поступить?
Это сообщение отредактировал(а) nc30 - 18.9.2010, 06:20 |
||||||
|
|||||||
| dobrolub |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 385 Регистрация: 18.12.2009 Где: Vancouver, Canada Репутация: 11 Всего: 16 |
Тесты для thread scheduling довольно сложная вещь. Ты правильно пишешь, что надо использовать join. Но тут ещё надо тест правильно написать , чтобы нигде в синхронизированный объект не попасть, и т.д. Для некоторых машин надо ставить yield , чтобы дать возможность threadam поменяться.
посмотри на код и позапускай:
|
|||
|
||||
| nc30 |
|
|||
|
Интересующийся :) ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 24.6.2010 Где: Санкт-Петербург Репутация: 5 Всего: 8 |
jk1
CyclicBarrier мне не подойдет, т. к. заранее неизвестно количество порождаемых потоков. Но за хорошую идею спасибо. dobrolub Уровень приведенного вами кода для меня пока высоковат. Пока остановился на варианте цикла в main thread по списку порожденных потоков с вызовом isAlive() и sleep(). Не очень элегантно, зато простенько. Благодарю за помощь |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
isAlive() и sleep() можно заменить на один join(). -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| nc30 |
|
||||||
|
Интересующийся :) ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 24.6.2010 Где: Санкт-Петербург Репутация: 5 Всего: 8 |
Пробовал - не то.
В этом случае порожденные потоки (CheckingThread) просто исполняются последовательно один за другим. Проверял. Пришлось сделать вот так:
Может я join() неправильно использую?.. |
||||||
|
|||||||
| Skipy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 487 Регистрация: 24.8.2006 Где: Москва, Россия Репутация: 6 Всего: 16 |
Запустить потоки, сложить в коллекцию. Потом в цикле по коллекции на каждый делать join(). |
|||
|
||||
| XoJIoD |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 23.4.2008 Репутация: нет Всего: нет |
Если надо получить результат работы дочерних потоков может лучше воспользоваться интерфейсом Callable.
|
|||
|
||||
| nc30 |
|
|||
|
Интересующийся :) ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 24.6.2010 Где: Санкт-Петербург Репутация: 5 Всего: 8 |
Всем спасибо за помощь. |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |