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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-31 11:09:19  来源:igfitidea点击:

LinkedList checkForComodification error java

javaasynchronouslinked-listconcurrentmodification

提问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 Iteratorto 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()方法