Die andere Frage ist über synchronisiert. Ich habe auch eine run() in Klasse Note, weil ich jedes Element in Notizen alle 5 Minuten ausgeben möchte. Aber ich bekomme immer eine Ausnahme: java.util.ConcurrentModificationException, wenn ich versuche, weitere Meetings in main zu machen. so i applay auf die Liste Notizen synchronisiert, die eine neue Sitzung hinzugefügt werden können, wenn ich über notes.My run-Methode wie folgt durchlaufen:Ist es eine gute Möglichkeit zu verhindern, ConcurrentModificationException
Ist es richtig, Art und Weise hier auf Liste Notizen ConcurrentModificationException zu verhindern synchronisiert? (In meinem Programm works.I es jetzt nie diese Ausnahme erhalten)
A Meeting Klasse und Hinweis Klasse kann gefällt das:
public class Meeting{
public Meeting(Note note_1,Note note_2){
note_1.addElement(this);
note_2.addElement(this);}
//another method hier
}
public class Note implements Runnable{
public final List<Meeting> notes = new ArrayList<Meeting>();
public void addElement(Meeting n){
entries.add(n);
}
@Override
public void run(){
while(true) {
for(Meeting n : notes){
System.out.println(n.toString);}
}
try{ Thread.sleep(10);}
}
}
}
Ich bekomme immer Ausnahmefehler über Ausnahme: java.util.ConcurrentModificationException, wenn ich versuche, mehr Meeting in Haupt zu machen, so dass ich ändere eine littel in der Klasse Hinweis, mag dies:
private static final List<Entry> entries = Collections.synchronizedList(new ArrayList<Entry>());
und in run()
@Override
public void run() {
while(true){
synchronized(notes){
for(Entry n : entries){
//do something
}
}
try {
Thread.sleep(10);
} catch (InterruptedException e) {
}
}
}
}
Während Ausnahme zu werfen Was Sie hierher gebracht hat, sollte ich auch darauf hinweisen, dass Ihre Logik nicht ideal ist, da [Sie sollten während der Konstruktion keinen Verweis auf "dieses" veröffentlichen (http://www.ibm.com/developerworks/java/library) /j-jtp0618.html) wenn Sie mehrere Threads verwenden möchten, da es Invarianten brechen kann, die "immer" halten müssen. Wenn Sie Ihren Code korrekt und konsistent einbetten, wird die Lesbarkeit um ein erstaunliches Maß verbessert. –
Dank Andrzej und Sorry, dass mein Code nicht richtig gepostet wird. Multiple Threads führt nicht zu ConcurrentModificationException in meinem Programm. Es tritt auf, wenn ich über die Liste in der Klasse Note iteriere und vielleicht ein neues Meeting-Objekt sich der Liste hinzufügen möchte – echo