| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > Завершение главного потока после порожденных |
| Автор: nc30 18.9.2010, 05:42 | ||||||
| Главный поток в цикле порождает несколько (количество заранее неизвестно) однотипных потоков, которые должны параллельно отработать. Главный поток должен дождаться завершения порожденных и вывести результаты их работы. Если я делаю так:
Другие варианты, которые пришли на мысль вместо использования join(): 1) Поставить после цикла while: Thread.sleep(1500). В течении этого времени порожденные потоки успевают отработать. Ненадежно. 2) Записывать порожденные потоки в коллекцию threads. Затем после окончания while:
3) Задать главному потоку более низкий приоритет, но здесь не будет 100% гарантии. Как лучше (и, желательно, проще) поступить?
|
| Автор: dobrolub 18.9.2010, 06:40 | ||
| Тесты для thread scheduling довольно сложная вещь. Ты правильно пишешь, что надо использовать join. Но тут ещё надо тест правильно написать , чтобы нигде в синхронизированный объект не попасть, и т.д. Для некоторых машин надо ставить yield , чтобы дать возможность threadam поменяться. посмотри на код и позапускай:
|
| Автор: nc30 24.9.2010, 13:42 |
| jk1 CyclicBarrier мне не подойдет, т. к. заранее неизвестно количество порождаемых потоков. Но за хорошую идею спасибо. dobrolub Уровень приведенного вами кода для меня пока высоковат. Пока остановился на варианте цикла в main thread по списку порожденных потоков с вызовом isAlive() и sleep(). Не очень элегантно, зато простенько. Благодарю за помощь |
| Автор: nc30 24.9.2010, 15:55 | ||||||
Пробовал - не то.
В этом случае порожденные потоки (CheckingThread) просто исполняются последовательно один за другим. Проверял. Пришлось сделать вот так:
Может я join() неправильно использую?.. |
| Автор: Skipy 24.9.2010, 16:14 | ||
Запустить потоки, сложить в коллекцию. Потом в цикле по коллекции на каждый делать join(). |
| Автор: XoJIoD 24.9.2010, 16:21 | ||||
Если надо получить результат работы дочерних потоков может лучше воспользоваться интерфейсом Callable.
|
| Автор: nc30 24.9.2010, 18:16 | ||
Всем спасибо за помощь. |