Как я могу заставить свою многопоточную программу печатать определенный вывод

У меня возникли проблемы с синхронизацией java-потоков, применением ожидания и уведомления.

Я хочу выяснить, как я могу реализовать это в программе, где я могу поочередно распечатывать ответ. Например, человек1 будет считать числа 1-5, а также человек2, вывод должен быть таким.

person1 count 1
person2 count 1
person1 count 2
person2 count 2
person1 count 3
person2 count 3
person1 count 4
person2 count 4
person1 count 5
person2 count 5

Спасибо, парни.


person xknozi    schedule 05.10.2012    source источник
comment
Вы не можете этого сделать. Планировщик Java имеет свой собственный алгоритм, чтобы решить, какой поток запустить. Звучит так, как будто вам нужен один многопоточный цикл.   -  person RNJ    schedule 05.10.2012
comment
Хотите, чтобы мы рассказали вам все о потоках в Java? Хотите, чтобы мы написали для вас программу? Можете быть более конкретными ?   -  person Tulains Córdova    schedule 05.10.2012
comment
В Java 7 для этого можно использовать Phaser. До Java 7 лучше всего подходил бы CountDownLatch. Но если это не просто упрощение какого-то реального параллельного сценария, нет смысла использовать многопоточность.   -  person Marko Topolnik    schedule 05.10.2012
comment
Потоки Java не предназначены для таких вещей. Вы можете сделать это с помощью блокировок, однако вам нужно быть очень осторожным, чтобы не создавать взаимоблокировки. Лично я бы реализовал это совершенно по-другому.   -  person G-Man    schedule 05.10.2012
comment
Эй, ребята, спасибо за ответ. Я не хочу, чтобы вы писали всю программу, мне просто нужно ваше представление о том, что я должен сделать, чтобы добиться такого результата. Мне трудно понять потоки Java, но я уделю больше времени, чтобы понять это. Я просто новичок в java и хочу научиться. и с вашей помощью я знаю, что могу это сделать. Спасибо, ребята, за ответ. Я буду информировать вас в своем прогрессе. Спасибо.   -  person xknozi    schedule 06.10.2012


Ответы (3)


Вы можете сделать это легко двумя способами:

  1. Передайте «маркер печати» между потоками, используя два семафора: поток 1 печатает, сигнализирует семафору A, ждет на семафоре B, затем зацикливается. Поток 2 ожидает на семафоре A, печатает, сигнализирует семафору B и зацикливается.

  2. Пишите встроенный однопоточный код.

person Martin James    schedule 05.10.2012
comment
Я думаю, что это было бы решением моей проблемы. но я понятия не имею о семафоре, можете ли вы дать мне ссылки, где были предоставлены учебные пособия и примеры? Спасибо. - person xknozi; 06.10.2012

Не используйте ожидание и уведомление. Используйте синхронизированные блоки.

Подробное объяснение того, как работает Java Monitor, включая примеры кода, можно найти здесь: http://www.artima.com/insidejvm/ed2/threadsynch.html

person Mikkel Løkke    schedule 05.10.2012
comment
Это не отвечает на вопрос - в частности, я не вижу, как использование синхронизированного блока будет чередовать потоки. - person assylias; 05.10.2012
comment
Технически wait/notify включает использование блоков synchronized, поскольку вам нужно удерживать блокировку, чтобы вызвать wait/notify. - person Tudor; 05.10.2012
comment
Тюдор: Я знаю, что технически synchronized просто обертывает ожидание/уведомление, я просто думаю, что семантика чище и понятнее. assylias: гусеницы будут чередоваться в том порядке, в котором монитор определил их приоритет. - person Mikkel Løkke; 06.10.2012

Вся цель многопоточных программ заключается в асинхронной работе потоков. Вот как вы получаете прирост производительности, потому что разные задачи могут работать на разных процессорах/ядрах одновременно, без синхронизации друг с другом. Чтобы принудительно синхронизировать выходные данные шага блокировки, по определению заставляют потоки делать что-то нетипичное.

Ответ @Martin предлагает альтернативы, чтобы заставить его работать.

person Gray    schedule 05.10.2012