Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
采用ConcurrentHashmap策略的Java多线程使用者_Java_Multithreading_Concurrenthashmap - Fatal编程技术网

采用ConcurrentHashmap策略的Java多线程使用者

采用ConcurrentHashmap策略的Java多线程使用者,java,multithreading,concurrenthashmap,Java,Multithreading,Concurrenthashmap,我们有一个采用经典生产者/消费者方法的多线程应用程序,它使用ConcurrentHashmap队列 使用者启动一个线程,该线程内部有一个无限循环,在并发hashmap上有另一个嵌套循环,该循环读取并删除每个已处理项 我在问自己,相对于地图上的“for”迭代和每个元素的“remove”,这个代码是否安全/有效 运行代码似乎是正确的 new Thread(t.getContextName()+"-RespMsgThread") { public void run() {

我们有一个采用经典生产者/消费者方法的多线程应用程序,它使用ConcurrentHashmap队列

使用者启动一个线程,该线程内部有一个无限循环,在并发hashmap上有另一个嵌套循环,该循环读取并删除每个已处理项

我在问自己,相对于地图上的“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();
新线程(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吗?还没有。你认为我可以有一个更高效/安全的算法吗?