Java 并发修改异常
我下面的代码引发了并发修改异常,我无法解决它。救命啊Java 并发修改异常,java,android,Java,Android,我下面的代码引发了并发修改异常,我无法解决它。救命啊 { long now = new Date().getTime(); Set<String> keyset = requests.keySet(); Iterator<String> iterator = keyset.iterator(); while (iterator.hasNext()) { String packetId = iterator.next()
{
long now = new Date().getTime();
Set<String> keyset = requests.keySet();
Iterator<String> iterator = keyset.iterator();
while (iterator.hasNext()) {
String packetId = iterator.next();
RequestHolder entry = requests.get(packetId);
if (entry.isExpired(now)) {
entry.getListener().onTimeout(packetId);
iterator.remove();
}
}
}
{
long now=new Date().getTime();
Set keyset=requests.keyset();
迭代器迭代器=keyset.Iterator();
while(iterator.hasNext()){
String packetId=iterator.next();
RequestHolder条目=requests.get(packetId);
if(entry.isExpired(现在)){
entry.getListener().onTimeout(packetId);
iterator.remove();
}
}
}
将代码替换为
long now = new Date().getTime();
Iterator<Map.Entry<String, RequestHolder>> iterator = requests.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, RequestHolder> entry = iterator.next();
String packetId = entry.getKey();
RequestHolder requestHolder = entry.getValue();
if (requestHolder.isExpired(now)) {
requestHolder.getListener().onTimeout(packetId);
iterator.remove();
}
}
long now=new Date().getTime();
迭代器迭代器=requests.entrySet().Iterator();
while(iterator.hasNext()){
Map.Entry=iterator.next();
String packetId=entry.getKey();
RequestHolder RequestHolder=entry.getValue();
if(requestHolder.isExpired(现在)){
requestHolder.getListener().onTimeout(packetId);
iterator.remove();
}
}
解决方案是迭代整个集合而不是密钥集,使用密钥集迭代器再次访问集合中的条目,并从密钥集中删除条目将while循环替换为此循环
for (Entry<String, RequestHolder> entryElem : requests.keySet()) {
String packetId = entryElem.getValue();
RequestHolder entry = requests.getValue.get(packetId);
if (entry.isExpired(now)) {
entry.getListener().onTimeout(packetId);
iterator.remove();
}
}
for(Entry entryElem:requests.keySet()){
字符串packetId=entryElem.getValue();
RequestHolder条目=requests.getValue.get(packetId);
if(entry.isExpired(现在)){
entry.getListener().onTimeout(packetId);
iterator.remove();
}
}
在迭代迭代器时,为什么需要删除它?我实际上要删除元素。执行request.remove(iterator.next())会出错。keyset
对象的类实现是什么?看起来它的迭代器不支持并发使用。你的请求对象是什么?我是说它的类型??对象“requests”的类型是:Map requests;它不支持请求。iterator()是的,因此它会生成一个如上所述的迭代器。。无法调用请求。迭代器()抱歉,考虑我的编辑(我忘了)。