Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    ConcurrentModificationException

    Salve ragazzi!! sto progettando un client che ogni tot secondi richiama delle specifiche funzioni su una lista, non appena però incontra la funzione che cancella gli elementi della lista mi viene restituito un errore (java.util.ConcurrentModificationException).
    Vi riporto di seguito il codice:
    codice:
    public class MyTimerClass extends java.util.TimerTask{ 		
        private LinkedList <String> listaComandi; 	 		
        
        public MyTimerClass(){ 		
            listaComandi=new LinkedList <String>();  	
        } 	 	
        
        public void run() { 		
            leggiComandi(); 		
            inviaComandi(); 		
            cancellaListaComandi(); 	
        }  	
    
        //-------------------------------------------------------------------------------------------------------------------------- 	
        public synchronized void cancellaListaComandi(){ 		
            for(String el:listaComandi){ 			
                listaComandi.remove(el); 		
            } 	
        }
    }
    L'errore restituito è il seguente:

    codice:
    Exception in thread "Timer-0" java.util.ConcurrentModificationException 	
    at java.util.LinkedList$ListItr.checkForComodification(LinkedList.java:953) 	
    at java.util.LinkedList$ListItr.next(LinkedList.java:886) 	
    at MyTimerClass.cancellaListaComandi(MyTimerClass.java:46) 	
    at MyTimerClass.run(MyTimerClass.java:38) 	
    at java.util.TimerThread.mainLoop(Timer.java:555) 	
    at java.util.TimerThread.run(Timer.java:505)

    Ho provato ad utilizzare una programmazione concorrente, ho provato utilizzando i metodi wait(),notify() e quant altro ma non sono riuscita a trovare una soluzione. Vi ringrazio anticipatamente!

  2. #2
    Utente di HTML.it L'avatar di neroux
    Registrato dal
    Aug 2009
    Messaggi
    1,973
    Per svuotare la lista sarebbe in generale meglio .clear(). Ma poi dovresti sincronizzare le chiamate sul'oggetto

    This exception may be thrown by methods that have detected concurrent modification of an object when such modification is not permissible.

    For example, it is not generally permissible for one thread to modify a Collection while another thread is iterating over it. In general, the results of the iteration are undefined under these circumstances. Some Iterator implementations (including those of all the general purpose collection implementations provided by the JRE) may choose to throw this exception if this behavior is detected. Iterators that do this are known as fail-fast iterators, as they fail quickly and cleanly, rather that risking arbitrary, non-deterministic behavior at an undetermined time in the future.

    www.sitemeer.com » Quando un sito pare irraggiungibile

    Se ti piace ci puoi trovare anche su Facebook

  3. #3
    Intanto grazie della risposta!! Come mi hai consigliato di fare ho utilizzato il metodo clear():

    codice:
    public synchronized void cancellaListaComandi(){ 		
        listaComandi.clear(); 	
    }
    Effettivamente il messaggio di errore che prima mi restituiva adesso non lo visualizzo più però il metodo è come se non funzionasse, in una parte del codice che non ho postato posso verificare quello che ti ho appena detto.
    Qualche consiglio su cosa utilizzare per la sincronizzazione?

  4. #4
    Innanzitutto il messaggio di errore ti veniva mostrato percheè stavi andando a rimuovere un record della lista, e poi in qualche altro punto cercavi di riutilizzarla, ma il puntatore si era già sc***ato!

    Il problema che hai adesso non l'ho ben capito..

    cioè tu fai la clear(), ma in realtà non la fa?? e ti ritrovi comunque con la lista piena?

  5. #5
    si, proprio così!! sembra strano anche a me questa situzione ma siccome neroux mi ha scritto che dopo aver messo clear al posto di remove devo "sincronizzare le chiamate sul'oggetto", penso che il problema sia proprio questo...

  6. #6
    Bhe è molto strano, probabilmente ricarichi in qualche modo la lista.

    Dal codice che hai inserito mi sembra di capire che tu stia utilizzando un oggetto di classe, in questo modo nei vari metodi lavori sempre sullo stesso oggetto, ne deduco che se lo hai svuotato sia così anche nel resto del codice, io controllerei meglio il flusso e andrei ad analizzare cosa viene eseguito successivamente alla chiamata di clear.

    Ciao
    Roberto

  7. #7
    C.v.d.!! avevo completamente perso di vista una microscopica parte del codice che mi fregava!! vi ringrazio tantissimo del vostro aiuto!

  8. #8
    Non c'è problema siamo quì per questo!

    Ciao
    Robero

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.