Dav*_*amp 10 java queue collections hashmap data-structures
现在我正在尝试创建一个生产者/消费者线程,生产者线程遍历所有可能的字母组合并创建它们各自的MD5哈希值.然后将每个组合及其哈希放入HashMap<String,String>.现在在我的消费者线程中,我希望能够Queue<>在hashmap上使用集合,这样我的消费者线程就可以调用poll()etc,从而删除atc,Queue但仍然让我能够在调用时看到组合及其哈希poll()我将如何去关于这样做?我有HashMap但不知道如何'制作'或将其作为队列投射.谢谢.
如果不处理代码的线程安全性,则不应使用HashMap.否则,您可能会以Live-lock结束.
为了能够使用插入键的顺序迭代Map,可以使用LinkedHashMap.
Map m = Collections.synchronizedMap(new LinkedHashMap(...));
Run Code Online (Sandbox Code Playgroud)
制作人会像这样推送条目(没什么特别的):
m.put(key, object)
Run Code Online (Sandbox Code Playgroud)
消费者会像这样轮询条目:
while (someCondition) {
Map.Entry nextEntry = null;
// This block is equivalent to polling
{
synchronized(s) {
Iterator i = s.iterator(); // Must be in the synchronized block
if (i.hasNext()) {
nextEntry = i.next();
i.remove();
}
}
}
if (nextEntry != null) {
// Process the entry
...
} else {
// Sleep for some time
...
}
// process
}
Run Code Online (Sandbox Code Playgroud)
的LinkedHashMap类型是等的组合HashMap和一个Queue-它存储密钥/值对,还记得在它们被插入的顺序.这可能正是您正在寻找的类型.没有显式poll()函数,但如果你得到一个迭代器,LinkedHashMap你将按照它们的添加顺序访问元素.你可能会编写一个这样的函数:
public <KeyType, ValueType> KeyType first(LinkedHashMap<KeyType, ValueType> map) {
assert !map.isEmpty();
return map.iterator().next();
}
Run Code Online (Sandbox Code Playgroud)
这会让你回到第一个元素.只需确保正确同步.
或者,您可以考虑Queue通过定义辅助类Pair然后将Pairs 存储在队列中来存储键/值对.
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
22902 次 |
| 最近记录: |