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

Enforce element from a map used by a thread should not be used by another thread until first thread completes execution

我有一张地图说

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

地图有 3 个元素。 [("one","alpha"),("two","beta"),("three","theta")]

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

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

Map 有值池,其中任何空闲的对都应该分配给线程

当线程选择使用它时,您可以从映射中删除每个元素。 因此你需要使用Hashtable而不是Hashmap,这样当多个线程同时修改它时就不会出现问题。 (Hash Table 是同步的,HashMap 不是)。

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

PS:始终使用相应的接口进行变量定义,以便您可以在需要时换出特定的class

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

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

同步发生在 Queue::take 操作中。

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