2012-10-22 16 views
6

Ok, quindi quello che sto cercando di fare qui è di avere un metodo "in esecuzione" di un processo per una certa quantità di "tempo", tutto questo funziona fino a un certo grado ma continua a dare queste ecceptions. Questa è la prima execption dàLinkedList checkForComodification error java

 Exception in thread "main" java.util.ConcurrentModificationException 

e poi in seguito nel exicutio dà questa

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) 

io non so quello che sto facendo male qui dovrei rendere questo concomitante o qualcosa del genere? Se é cosi, come? Pensavo che la lista collegata fosse sincrona per sua natura? forse quello in cui sto facendo questo incasinato.

Bene alcun modo qui è il metodo che 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; 
} 

e qui è dove mi chiamo nel metodo principale

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; 

     } 
    } 

grazie per tutto l'aiuto con questa

+0

Vorrei utilizzare un ExecutorService che è incorporato, thread-safe, combina una coda e un pool di thread e consente di ottenere i risultati delle singole attività. –

risposta

8

- Si stanno accedendo contemporaneamente e modificando la collezione, che possono 't essere fatto da for-Ogni loop direttamente ..

- Usa Iterator per risolvere questo problema.

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


} 
+0

bene mi piace questo approccio e l'ho provato ma mi dà ancora gli stessi errori 'Iterator it = q1.iterator(); while (it.hasNext()) { MyProcess mp = it.next(); mp.calculatePriority(); switch (mp.priority) { caso 1: pausa; caso 2: q1.remove (mp); q2.add (mp); rompere; caso 3: q1.remove (mp); q3.add (mp); rompere; caso 4: q1.remove (mp); q4.add (mp); rompere; } – MNM

+0

} Scratch che ho avuto modo di funzionare Non stavo usando la funzione itorator.remove() stavo usando l'elenco collegato uno – MNM

+0

@MNM Sono contento che tu l'abbia fatto, e tu sei il più benvenuto –

4

ConcurrentModificationException si verifica quando si tenta di rimuovere un elemento da un elenco mentre si sta iterando attraverso di esso utilizzando un ciclo for.

sto cercando di indovinare il vostro errore è venuta da queste linee -

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

} 

per correggere l'errore, utilizzare il metodo iterator.remove()

Problemi correlati