9

好的,所以我在这里尝试做的是让一个方法在给定的“时间”内“运行”一个过程,这一切都在一定程度上起作用,但它不断给出这些感觉。这是它给出的第一个例外

     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;

        }
    }
4

2 回答 2

13

您正在同时访问和修改集合,这不能直接从 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.
     }
 }
于 2012-10-22T14:37:54.830 回答
3

ConcurrentModificationException 发生在您尝试从 List 中删除元素时,同时使用 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;
    }
}

要修复错误,请使用iterator.remove()方法

于 2012-10-22T14:33:17.043 回答