高分请教java.util.ConcurrentModificationException问题

pang040328 2009-09-13 07:55:31
错误如下:
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.LinkedList$ListItr.checkForComodification(Unknown Source)
at java.util.LinkedList$ListItr.next(Unknown Source)
at simulate.proccess(simulate.java:197)
at simulate.adjust(simulate.java:90)
at simulate.main(simulate.java:69)
关键代码如下:
队列的定义:
public static Queue<Patient> waiWaitList = new LinkedList<Patient>();
public static Queue<Patient> bai1WaitList = new LinkedList<Patient>();
public static Queue<Patient> bai2WaitList = new LinkedList<Patient>();


public static void proccess(Queue<Patient> p ,int currentTime,int leftOfEmptyBeds,int totalTime)
{
int minSeeTime = minSeeTime(p); //求出数组中最小门诊时间
//int numOfMinSeeTime = numOfPatient(p, minSeeTime); //算出最小门诊时间的个数
/*if(numOfMinSeeTime < leftOfEmptyBeds) //外伤人数小于剩余病床数
{*/
197行: for (Patient patient : p)
/* for(Iterator it = p.iterator();it.hasNext();)*/
{
/* Patient patient = (Patient)it.next();*/
if (patient.getSeeTime() == minSeeTime)
{ //在数组中找到最小门诊时间的对象
for (int i = 0; i < bed.length; i++)
{ //遍历病床数组,寻找空床,若出现空床,则将病人填入病床数组,并从等待队列中将该病人删除。
if (bed[i].isEmpty() == true)
{
patient.setInTime(currentTime);//入院时间
patient.setWaitTime(currentTime-patient.getSeeTime());
patient.setOutTime(currentTime+totalTime);//外伤总住院天数为8天
bed[i].setPatients(patient);
//it.remove();
p.poll();
//p.remove();
leftOfEmptyBeds--; //剩余病床数减少
}
}
}
}
//}
}


请高手帮忙解答一下,很急啊
...全文
246 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
liwenso 2009-09-22
  • 打赏
  • 举报
回复
这个异常最简单的方法就是用6L的解决方法。
pang040328 2009-09-21
  • 打赏
  • 举报
回复
回帖有分!
diggywang 2009-09-17
  • 打赏
  • 举报
回复
将LinkedList全部换成ConcurrentLinkedQueue试试,很明显你是多线程操作,在这种情况下,LinkedList是线程不安全的。
pang040328 2009-09-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lee_09 的回复:]

你的for循环写错的吧?for(Iterator it = p.iterator();it.hasNext();)你这样的话不是每次循环Iterator对象都初始化一次吗?最好用while循环
Iterator iter = p.iterator();(这可能会要进行强制类型转换)
while(it.hasNext()){
  …………
  …………
}
[/Quote]
你没开我玩笑吧??!这个for结构和你写的while结构效果是一样的啊!没错,这样做确实是非法的,那有什么办法来用poll呢?总不能不用吧?
pang040328 2009-09-14
  • 打赏
  • 举报
回复
后来我也是试图用iterator,但还是出现错误。后来我发现ArrayList控制得好的话,功能其实跟队列差不多,而且还很方便。问题解决了,很开心,回帖赏分
lee_09 2009-09-14
  • 打赏
  • 举报
回复
for (Patient patient : p) 换用Iterator来循环,因为你调用poll()的话会修改Queue内部的映射值,而这样做是非法的
你的for循环写错的吧?for(Iterator it = p.iterator();it.hasNext();)你这样的话不是每次循环Iterator对象都初始化一次吗?最好用while循环
Iterator iter = p.iterator();(这可能会要进行强制类型转换)
while(it.hasNext()){
…………
…………
}
jinxfei 2009-09-13
  • 打赏
  • 举报
回复
p.poll();
从队列中摘掉最头上的对象。


你在遍历一个列表的同时,从列表中摘除对象,这样操作是有问题的,即便逻辑上没有错误,也不推荐这样做,建议你改用iterator来实现这种形式的操作。

我看你原来也有iterator的操作方式,结果被注释了,不知道为什么。
woming66 2009-09-13
  • 打赏
  • 举报
回复
没遇见过!帮不了你!

50,549

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧