| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > Синхронизация потоков |
| Автор: batex 21.10.2011, 14:38 | ||
Возникла проблема с синхронизацией большого кол-во потоков с помощью функций wait(), notify(). Используется массив lock'ов. Код должен делать следующее: создает по параметру одинаковые потоки, которые уменьшают по очереди второй параметр. Потоки создаются, но в итоге программа виснет.
|
| Автор: LSD 21.10.2011, 15:56 |
| Ctrl+Break выведет на консоль тред дамп, там можно посмотреть какой поток чем занят (только передай в конструктор Thread нормальное имя). Ну и хотелось бы описание того, что ты пытался реализовать. |
| Автор: priam220 21.10.2011, 16:04 | ||||
в определенный момент они все у тебя засыпают, следовательно:
Вывод: Thread 1 9 Thread 3 8 Thread 3 6 Thread 3 5 Thread 3 4 Thread 3 3 Thread 3 2 Thread 3 1 Thread 3 0 Threads 3 finish Thread 1 7 Threads 1 finish Threads 2 finish Threads 5 finish Threads 7 finish Threads 4 finish Threads 9 finish Threads 6 finish Threads 8 finish Threads 10 finish P.S. не ясно, что вы пытаетесь сделать wait/notify, причем применяя их к разным переменным. Но если дело в декременте, то лучше сделать так:
|
| Автор: batex 21.10.2011, 17:36 | ||
Реализовать я хотел следующее: создать много одинаковых потоков, которые будут по очереди уменьшать параметр "а" на 1. У каждого потока есть свой sync для синхронизации. Переменные для синхранизации разные - потому что я хотел сначала разбудить поток "n", потом уменьшить "а", потом разбудить следующий поток |
| Автор: priam220 21.10.2011, 21:13 | ||||
Пришлось немного задержаться на работе, но в конце-концов я понял, что нужно. Вот рабочий код:
Успехов! |
| Автор: batex 22.10.2011, 10:02 |
| Большое спасибо за помощь! |
| Автор: priam220 24.10.2011, 13:52 |
Можно использовать AtomicInteger. Но чем он лучше блока синхронизации?.. |
| Автор: LSD 24.10.2011, 14:12 | ||
Быстрее и прозрачнее логика. |