在第一个线程完成执行之前,线程使用的映射中的 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
操作中。
这种设计确保不会有两个线程同时使用对。
我有一张地图说
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
操作中。
这种设计确保不会有两个线程同时使用对。