Как понять, завершило ли ваше приложение вычисления в многопоточном сценарии потребитель-производитель в Java - PullRequest
0 голосов
/ 21 февраля 2020

Я пробую свои силы в многопоточности в java, чего я никогда раньше не делал. Приложение для домашних животных, которое я сейчас пытаюсь разработать, имеет одну очередь блокировки и несколько рабочих. Приложение придерживается следующих правил:

  • Рабочий ожидает сообщения в очереди
  • Когда работник получает сообщение из очереди, он обрабатывает его и может выдавать больше сообщений, которые добавляются обратно в очередь.
  • Некоторые сообщения не генерируют больше сообщений.
  • Приложение запускается с несколькими сообщениями в очереди.
  • 1 Worker = 1 Thread

Приложение должно завершиться, если:

  • В очереди больше нет сообщений
  • Все работники заблокированы и ожидают сообщения для быть израсходованным

По сути, как только все сообщения будут использованы, и в системе не будет создано / представлено больше сообщений, я должен выйти. Приложение гарантированно достигнет этой точки в конечном итоге.

Теперь мой вопрос, я не уверен, что является лучшей практикой / дизайном, чтобы понять, когда вышеупомянутые условия истинны, избегая условий гонки. Любая помощь?

Я в настоящее время на стадии разработки, поэтому у меня нет кода, чтобы показать вам, извините за это (я знаю, мой вопрос на данный момент довольно общий c, поэтому не стесняйтесь задайте мне любой вопрос). Любой совет приветствуется!

Заранее спасибо!

1 Ответ

1 голос
/ 21 февраля 2020

Один из способов сделать это состоит в том, чтобы каждый работник добавил 1 в AtomicInteger, когда он запускается (представляя, что он работает), а затем вычел 1, когда он закончился. После вычитания 1, если AtomicInteger равен 0, это означает, что «активных» рабочих нет.

Поэтому, когда рабочий завершается, он вычтет 1 из atomicInteger и затем проверит, равен ли размер очереди нулю (нет ожидающих сообщений) и целое число атоми c равно нулю (нет активных работников), вы можете выйти из приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...