线程使用的映射中的Enforce元素不应被另一个线程使用,直到第一个线程完成执行

时间:2019-04-21 07:29:48

标签: java selenium testng

我有一个地图说

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

,地图包含3个元素。 [(“ one”,“ alpha”),(“ two”,“ beta”),(“ three”,“ theta”)]

现在我必须并行运行五个线程,使用上面映射中的任何一对,以便新线程只应使用空闲对。

我的意思是,并行运行的两个线程都不应该具有相同的一对值。 需要强制执行任何正在运行的线程,该线程使用的一对值不应同时被另一个线程使用

地图具有值池,并且其中的任何空闲对都应分配给线程

2 个答案:

答案 0 :(得分:1)

我认为更好的解决方案是将Map替换为BlockingQueue,并使用自定义类型来表示对/元组。

  • 您使用并发队列类型实例化队列,并使用所有对/元组填充它。
  • 每个线程从队列的前面获取一对,如果没有可用的线程则阻塞。
  • 线程完成后,它将对添加到队列的后面。

通过Queue::take操作进行同步。

这种设计可确保两个线程不会同时使用任何对。

答案 1 :(得分:0)

当一个线程选择使用它时,您可以从Map中删除每个元素。 因此,您将需要使用Hashtable而不是Hashmap,这样,当多个线程同时对其进行修改时,就不会有问题。 (哈希表已同步,而HashMap未同步。)

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

PS:始终将相应的接口用于变量定义,以便您可以在需要时交换特定的类