Hallo,
unten findet sich ein ausführbares Programm, welches kurz nach dem Start eine
java.util.ConcurrentModificationException in Zeile 80 wirft.
Ich komm nicht drauf, wie ich synchronisieren soll, damit diese Exception nichtmehr auftritt,
Meine Vermutung ist, dass das Problem bei den beiden erzeugten Threads im Consumer auftritt, beide Threads teilen sich die sharedMap. ICh weiß aber nicht, wie ich den Zugriff auf die sharedMap von den beiden Threads synchronisiere.
ich hoffe ihr könnt mir helfen.
Besten Dank!!
PS: Das Programm macht vielleicht so nicht so viel sinn, ich habs aber drastisch zusammengekürzt und das was unten noch übrig ist stellt genau mein Problem dar.
unten findet sich ein ausführbares Programm, welches kurz nach dem Start eine
java.util.ConcurrentModificationException in Zeile 80 wirft.
Ich komm nicht drauf, wie ich synchronisieren soll, damit diese Exception nichtmehr auftritt,
Meine Vermutung ist, dass das Problem bei den beiden erzeugten Threads im Consumer auftritt, beide Threads teilen sich die sharedMap. ICh weiß aber nicht, wie ich den Zugriff auf die sharedMap von den beiden Threads synchronisiere.
ich hoffe ihr könnt mir helfen.
Besten Dank!!
PS: Das Programm macht vielleicht so nicht so viel sinn, ich habs aber drastisch zusammengekürzt und das was unten noch übrig ist stellt genau mein Problem dar.
Java:
package concurrencytestserver;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
/********* Klasse Producer ***********/
class Producer {
private final Map<String, List<String>> sharedMap;
private final Consumer startServer;
public static final List<String> connectedClientList;
static {
connectedClientList = new ArrayList<String>();
connectedClientList.add("Test1");
connectedClientList.add("Test2");
}
public Producer(Consumer startServer) {
sharedMap = new HashMap<String, List<String>>();
this.startServer = startServer;
}
public void startThread() {
final Thread th = new Thread(runnable);
th.start();
}
final Runnable runnable = new Runnable() {
public void run() {
while(true) {
final List<String> list = new ArrayList<String>();
final String changedValue = new String("IrgendeinText");
list.add(changedValue);
synchronized(sharedMap) {
for (int i = 0; i < connectedClientList.size(); i++) {
final String clientName = connectedClientList.get(i);
sharedMap.put(clientName, list);
}
startServer.setDataInClassStartServer(sharedMap); // hier die sharedMap in das Object von Consumer schieben
}
try {
Thread.sleep(400);
}
catch(InterruptedException ie) {
System.out.println("Ausnahme generateData, sleep");
}
}
}
};
}
/********* Klasse Consumer **********/
public class Consumer<T> {
private Map<String, List<String>> sharedMap;
public Consumer() {
sharedMap = new HashMap<String, List<String>>();
}
public void startThreads() { //mehrere Thread arbeiten auf der sharedMap
final List<String> connectedClientList = Producer.connectedClientList;
for (String string : connectedClientList) {
final SendDataCyclicToClient sdtc = new SendDataCyclicToClient(string);
sdtc.start();
}
}
public void setDataInClassStartServer(final Map<String, List<String>> sharedMap) {
this.sharedMap = sharedMap;
}
private final class SendDataCyclicToClient extends Thread {
private String connectionName;
public SendDataCyclicToClient(final String connectionName) {
this.connectionName = connectionName;
}
@Override
public void run() {
while(true) { // arbeitet auf der shared Map
final Map<String, List<String>> map = sharedMap;
synchronized(map) {
for(final Iterator<String> connectionNameIterator = map.keySet().iterator(); connectionNameIterator.hasNext();) {
final String mapConnectionName = connectionNameIterator.next(); // hier wird die Exception geworfen
if(mapConnectionName.equals(connectionName)) {
map.remove(connectionName);
}
}
}
}
}
}
public static void main(String[] args) {
final Consumer startServer = new Consumer();
final Producer producer = new Producer(startServer);
startServer.startThreads();
producer.startThread();
}
}
Zuletzt bearbeitet: