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()是的,因此它会生成一个如上所述的
迭代器。。无法调用请求。迭代器()抱歉,考虑我的编辑(我忘了)。