LinkedList checkForComodification ошибка java
Итак, то, что я пытаюсь сделать здесь, - это иметь метод, "запускающий" процесс в течение заданного количества "времени", это все швы, чтобы работать в определенной степени, но он продолжает давать эти представления. Это первое исполнение, которое он дает
Exception in thread "main" java.util.ConcurrentModificationException
А затем в 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)
Я не знаю, что я делаю неправильно Здесь я должен сделать это параллельным или что-то еще? Если да, то как? Я думал, что связанные списки синхронны по своей природе? может быть, там, где я получаю это портить.
Ну в любом случае вот метод, который я использую:
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;
}
И вот где я вызываю его в основном методе
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;
}
}
Спасибо за любую помощь с этим
2 ответа:
- Вы одновременно получаете доступ и изменяете коллекцию, что не может быть сделано непосредственно из цикла for-Each..
- Используйте
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. } }
ConcurrentModificationException возникает при попытке удалить элемент из списка во время итерации по нему с помощью цикла for.
Я предполагаю, что ваша ошибка исходит из этих строк --
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; } }
Чтобы исправить ошибку, используйте итератор .remove () Метод