Java 是否可以为HashMap集创建队列?
现在我正在尝试创建一个生产者/消费者线程,生产者线程遍历所有可能的字母组合并创建它们各自的MD5哈希。然后将每个组合及其散列放入Java 是否可以为HashMap集创建队列?,java,data-structures,collections,queue,hashmap,Java,Data Structures,Collections,Queue,Hashmap,现在我正在尝试创建一个生产者/消费者线程,生产者线程遍历所有可能的字母组合并创建它们各自的MD5哈希。然后将每个组合及其散列放入HashMap。现在,在我的消费者线程中,我希望能够使用hashmap上的队列集合,这样我的消费者线程就可以调用poll()等,这样就可以像队列那样删除值,但在调用poll()时,仍然可以看到组合及其散列我该怎么做?我有HashMap,但不知道如何“生成”或将其转换为队列。 谢谢。类型类似于HashMap和队列的组合-它存储键/值对,但也记住它们插入的顺序。这可能正是你
HashMap
。现在,在我的消费者线程中,我希望能够使用hashmap上的队列
集合,这样我的消费者线程就可以调用poll()
等,这样就可以像队列
那样删除值,但在调用poll()时,仍然可以看到组合及其散列
我该怎么做?我有HashMap
,但不知道如何“生成”或将其转换为队列。
谢谢。类型类似于HashMap
和队列
的组合-它存储键/值对,但也记住它们插入的顺序。这可能正是你要找的类型。没有显式的poll()
函数,但是如果在LinkedHashMap
上获得迭代器,则将按照元素添加的顺序访问元素。然后您可能会编写如下函数:
public <KeyType, ValueType> KeyType first(LinkedHashMap<KeyType, ValueType> map) {
assert !map.isEmpty();
return map.iterator().next();
}
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
}
公钥类型优先(LinkedHashMap){
assert!map.isEmpty();
返回map.iterator().next();
}
这将返回第一个元素。只需确保适当地同步
可选地,您可以考虑通过定义一个帮助类<代码> >对/<代码>,在一个<代码>队列中存储密钥/值对,然后在队列中存储<代码>配对< /代码> s。
希望这有帮助 我建议您创建一个EntrySet队列-
Queue<EntrySet<String,String>> queue = new SynchronousQueue<EntrySet<String,String>>();
for (EntrySet<String,String> entry:map.entrySet()) {
queue.add(entry);
}
Queue Queue=new SynchronousQueue();
for(EntrySet条目:map.EntrySet()){
添加(条目);
}
您可以考虑使用另一种类型的队列,它允许您放置元素,只有PrDuuple在非空的情况下等待。BR>
如果需要,生产者将能够基于EntrySet对象重新组合映射。如果不处理代码的线程安全性,则不应使用HashMap。否则,您可能会以活动锁结束 为了能够按照插入键的顺序迭代映射,可以使用LinkedHashMap
Map m = Collections.synchronizedMap(new LinkedHashMap(...));
制作人会推出这样的作品(没什么特别的):
消费者会对如下条目进行投票:
public <KeyType, ValueType> KeyType first(LinkedHashMap<KeyType, ValueType> map) {
assert !map.isEmpty();
return map.iterator().next();
}
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
}
很好,所以他只需要一些SyncObject就可以在消费者端读取LinkedHashMap时发出信号。嗨,LinkedHashMap不是线程安全的,也不是队列类型。@sperumal-我从来没有暗示过这两种情况都是这样。我假设OP将提供同步代码。此外,我不认为有任何要求它必须是
队列类型
;OP的问题从来没有提到这一点。如果这是一个要求,那么这种方法肯定不会起作用。谢谢你,这看起来确实是一个完美的解决方案,但是我还需要做些什么来保证线程安全呢?向LinkedHashMap添加volatile修饰符就足够了吗?@DavidKroukamp-有很多方法可以做到这一点,但是添加volatile
不会做到这一点。您需要同步访问LinkedHashMap
;可能是通过显式地在上面同步,或者可能是通过使用类似于信号量的东西。谢谢你,我试试看。有一个问题是这是线程安全的吗?谢谢,这很有魅力,而且实现起来很快、很容易、很清晰