采用ConcurrentHashmap策略的Java多线程使用者
我们有一个采用经典生产者/消费者方法的多线程应用程序,它使用ConcurrentHashmap队列 使用者启动一个线程,该线程内部有一个无限循环,在并发hashmap上有另一个嵌套循环,该循环读取并删除每个已处理项 我在问自己,相对于地图上的“for”迭代和每个元素的“remove”,这个代码是否安全/有效 运行代码似乎是正确的采用ConcurrentHashmap策略的Java多线程使用者,java,multithreading,concurrenthashmap,Java,Multithreading,Concurrenthashmap,我们有一个采用经典生产者/消费者方法的多线程应用程序,它使用ConcurrentHashmap队列 使用者启动一个线程,该线程内部有一个无限循环,在并发hashmap上有另一个嵌套循环,该循环读取并删除每个已处理项 我在问自己,相对于地图上的“for”迭代和每个元素的“remove”,这个代码是否安全/有效 运行代码似乎是正确的 new Thread(t.getContextName()+"-RespMsgThread") { public void run() {
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();
新线程(t.getContextName()+“-RespMsgThread”){
公开募捐{
试一试{
做{
对于(条目nodeEntry:t.getHtForResponse().entrySet())
{
-->使用节点条目执行一些操作
//从队列中删除节点
t、 getHtForResponse().remove(nodeEntry.getKey());
}
收益率();
}
而(!t.isStopControllerRun());
}捕获(中断异常例外){
Context.getInstance().getLogger().info(“错误:+ExceptionUtils.getStackTrace(ex));
}
}
}.start();
当地图上没有你只提供的物品时,也许你可以睡觉。作为睡眠的一种替代方法,你可以使用类似的东西。通过在BlockingQueue上使用take()方法,您将在插入项后立即获取该项。
您还可以使用方法检查线程是否已停止。当地图中没有您只提供的项目时,也许您可以睡觉。作为睡眠的一种替代方法,你可以使用类似的东西。通过在BlockingQueue上使用take()方法,您将在插入项后立即获取该项。
您还可以使用该方法检查线程是否已停止。是的,相对于“for”迭代,它是完全安全/有效的。这里有一个问题,因为ConcurrentHashMap的迭代器是弱一致的,所以您可以删除未处理的键的值(在您的示例中使用节点条目执行一些操作) <>你可以考虑调用方法< /p>
remove(Object key, Object value)
removes the entry for a key only if currently mapped to a given value.
与普通的删除(对象键)方法不同是的,它对“for”迭代非常安全/有效。这里有一个问题,因为ConcurrentHashMap的迭代器是弱一致的,所以您可以删除未处理的键的值(在您的示例中使用节点条目执行一些操作) <>你可以考虑调用方法< /p>
remove(Object key, Object value)
removes the entry for a key only if currently mapped to a given value.
请提供更多详细信息,而不是简单的删除(对象键)方法,问题不清楚。顺便说一下,默认情况下ConcurrentHashmap对迭代是安全的。您使用的是什么java版本?java 8。for on条目是安全的吗?请尊重将项目放入其中的消费者,然后删除?您考虑过使用java streams吗?还没有。你认为我可以有一个更有效/安全的算法吗?请提供更多细节,问题不清楚。顺便说一下,默认情况下ConcurrentHashmap对迭代是安全的。您使用的是什么java版本?java 8。for on条目是安全的吗?请尊重将项目放入其中的消费者,然后删除?您考虑过使用java streams吗?还没有。你认为我可以有一个更高效/安全的算法吗?