【发布时间】:2019-05-17 06:29:31
【问题描述】:
我们有一个使用 ConcurrentHashmap 队列的经典生产者/消费者方法的多线程应用程序。
消费者启动一个线程,该线程内部有一个无限循环,并发哈希映射上的另一个嵌套循环读取并删除每个已处理的项目。
我问自己这段代码对于地图上的“for”迭代和每个元素的“remove”是否安全/有效。
运行代码好像是对的……
new Thread(t.getContextName()+"-RespMsgThread") {
public void run() {
try {
do {
for (Entry<Integer, AbstractMessage> nodeEntry : t.getHtForResponse().entrySet())
{
--> Doing some stuff with the node Entry
// remove the node from the queue
t.getHtForResponse().remove(nodeEntry.getKey());
}
yield();
}
while (!t.isStopControllerRun());
} catch (InterruptedException ex) {
Context.getInstance().getLogger().info("ERROR: " + ExceptionUtils.getStackTrace(ex));
}
}
}.start();
【问题讨论】:
-
请提供更多细节,问题不清楚。顺便说一句,默认情况下 ConcurrentHashmap 对于迭代是安全的。
-
你用的是什么java版本?
-
Java 8. for on 条目是否安全尊重将物品放入其中并删除的消费者?
-
你考虑过使用java流吗?
-
还没有。你认为我可以有一个更有效/更安全的算法吗?
标签: java multithreading concurrenthashmap