Элемент Enforce из карты, используемой потоком, не должен использоваться другим потоком, пока первый поток не завершит выполнение - PullRequest
0 голосов
/ 21 апреля 2019

У меня есть карта сказать

HashMap<String, String> init = new Hashmap<String, String>

и карта имеет 3 элемента. [( "Один", "альфа"), ( "два", "бета"), ( "три", "тета")]

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

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

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

Ответы [ 2 ]

1 голос
/ 21 апреля 2019

Я думаю, что лучшее решение - заменить Map на BlockingQueue и использовать пользовательский тип для представления пар / кортежей.

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

Синхронизация выполняется с помощью операции Queue::take.

Такая конструкция гарантирует, что никакая пара не используется двумя потоками одновременно.

0 голосов
/ 21 апреля 2019

Вы можете просто удалить каждый элемент с карты, когда поток решит использовать его. Поэтому вам нужно будет использовать Hashtable вместо Hashmap, чтобы не было проблем, когда несколько потоков изменяют его одновременно. (Хэш-таблица синхронизирована, а HashMap нет).

Map<String, String> init = new Hashtable<String, String>()

PS: всегда используйте соответствующие интерфейсы для определения переменных, чтобы при необходимости вы могли поменять определенный класс

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