LinkedList checkForCommodification 错误 java
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/13013480/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
LinkedList checkForComodification error java
提问by MNM
Ok so what I am trying to do here is to have a method "running" a process for a given amount of "time" this all seams to work to a degree but it keeps giveing these eceptions. This is the first execption it gives
好的,所以我在这里尝试做的是让一种方法在给定的“时间”内“运行”一个过程,这一切都在一定程度上工作,但它一直在给出这些eceptions。这是它给出的第一个执行
Exception in thread "main" java.util.ConcurrentModificationException
and then later on in the exicutio it gives this
然后在 exicutio 中它给出了这个
at java.util.LinkedList$ListItr.checkForComodification(LinkedList.java:761)
at java.util.LinkedList$ListItr.next(LinkedList.java:696)
at parta.PartA.runQueueOne(PartA.java:273)
I dont know what I am doing wrong here am i supposed make this concurrent or something? If so how? I thought that linked list were synchronous by nature? maybe that where im getting this messed up.
我不知道我在这里做错了什么我应该让这个并发还是什么?如果是这样怎么办?我认为链表本质上是同步的?也许是我把事情搞砸了。
Well any way here is the method that im usings:
那么这里的任何方式都是我使用的方法:
public static void runQueueOne(LinkedList<MyProcess> q1, LinkedList<MyProcess> q2, LinkedList<MyProcess> q3, LinkedList<MyProcess> q4, int ct)
{
System.out.println("Running Level One Queue");
for(MyProcess p : q1)
{
if(p.name.equalsIgnoreCase(q1.getFirst().name))
{
//add 3 millsedonds to the service time
q1.getFirst().serviceTimeTotal += 3;
System.out.println(q1.getFirst().name + " is running");
}else
{
//add 3 millseconds to wait time fr the un busy one
p.waitTimeTotal+=3;
}
}
for(MyProcess p : q2)
{
p.waitTimeTotal+=3;
}
for(MyProcess p : q3)
{
p.waitTimeTotal+=3;
}
for(MyProcess p : q4)
{
p.waitTimeTotal+=3;
}
//calculate all the priority
for(MyProcess p : q1)
{
p.calculatePriority();
switch(p.priority)
{
case 1: break;
case 2: q1.remove(p); q2.add(p); break;
case 3: q1.remove(p); q3.add(p); break;
case 4: q1.remove(p); q4.add(p); break;
}
}
ct += 3;
}
and here is where I call it in the main method
这是我在 main 方法中调用它的地方
while(!allProcessDone)
{
//arrival queue
for(MyProcess p :al )
{
addToQueue(qOne, p, currentTime);
//cheack to see if all the processes are done
if(p1.isDone == true &
p2.isDone == true &
p3.isDone == true &
p4.isDone == true &
p5.isDone == true &
p6.isDone == true &
p7.isDone == true &
p8.isDone == true &
p9.isDone == true &
p10.isDone == true )
{
//end the loop
allProcessDone = true;
System.out.println("All proccess have been completed");
break;
}
switch (robin)
{
case 1: runQueueOne(qOne,qTwo, qThree, qFour, currentTime); robin = 2;
break;
case 2: runQueueTwo(qOne,qTwo, qThree, qFour, currentTime); robin = 3;
break;
case 3 : runQueueThree(qOne,qTwo, qThree, qFour, currentTime); robin = 4;
break;
case 4 : runQueueFour(qOne,qTwo, qThree, qFour, currentTime); robin = 1;
break;
}
}
thanks for any help with this
感谢您对此的任何帮助
回答by Kumar Vivek Mitra
-You are Concurrently accessing and modifying the Collection, that can't be done from for-Each loop directly..
-您正在同时访问和修改集合,这不能直接从 for-Each 循环中完成..
-Use Iterator
to solve this problem.
-使用Iterator
来解决这个问题。
LinkedList<MyProcess> q1 = new LinkedList<MyProcess>();
Iterator<MyProcess> iterator = q1.iterator();
while (iterator.hasNext()){
MyProcess mp = iterator.next();
if (mp.name.equals("xyz")){
iterator.remove(); // You can do the modification here.
}
}
回答by Kal
ConcurrentModificationException occurs when you try to remove an element from a List while you are iterating through it using a for loop.
ConcurrentModificationException 当您在使用 for 循环遍历 List 时尝试从 List 中删除元素时会发生 ConcurrentModificationException。
I'm guessing your error is coming from these lines --
我猜你的错误来自这些行——
for(MyProcess p : q1)
{
p.calculatePriority();
switch(p.priority)
{
case 1: break;
case 2: q1.remove(p); q2.add(p); break;
case 3: q1.remove(p); q3.add(p); break;
case 4: q1.remove(p); q4.add(p); break;
}
}
To fix the error, use iterator.remove()method
要修复错误,请使用iterator.remove()方法