1. ホーム
  2. java

[解決済み] LinkedList checkForComodification エラー java

2022-02-28 22:45:27

質問

私がここでやろうとしていることは、メソッド "running" プロセスを与えられた量 "time" のために持っていることです。このすべてがある程度は動作するように見えますが、これらの例外を与え続けています。 これは、最初に表示されるエラーです。

     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;
}

そして、これを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;

        }
    }

解決方法は?

コレクションへのアクセスと変更を同時に行っているため、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.
     }
 }