Mein Haupt spawnt 2 Threads und beide müssen auf die gleiche Liste zugreifen. Ich bin nicht sicher, was der beste Weg ist, dies zu tun. Hier ist, was ich habe, aber ich laufe immer noch in concurrentModificationException.Wie kann ich auf diese Liste zugreifen und auch Thread-sicher sein?
class Parent {
private List<String> data;
public List<String> getData() {
return data;
}
public static void main(String args[]) {
Parent p = new Parent();
p.start();
}
public void start() {
Thread a = new Thread(new A(this)).start();
Thread b = new Thread(new B(this)).start();
}
public A implements Runnable {
private Parent parent;
public A(Parent p) {
parent = p;
}
public void run() {
while (true) {
parent.getData().add("data");
}
}
}
public B implements Runnable {
private Parent parent;
public B(Parent p) {
parent = p;
}
public void run() {
Iterator<String> i = parent.getData().iterator();
while(i.hasNext()) {
// do more stuff with i
i.remove();
}
}
}
}
meine A
Klasse ist im Grunde ein Produzent von Daten und B
ist der Verbraucher. Ich akzeptiere die Möglichkeit, dass ich das falsch mache. So ist jede Hilfe willkommen. Ich muss nur sicher in der Lage sein, zu einer Liste von einem Thread hinzuzufügen und ein Element aus der Liste von einem anderen Thread zu entfernen. Danke im Voraus.
Verwenden Sie keine Liste anstelle einer Warteschlange. Im [java.util.concurrent] (https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/package-summary.html) gibt es zahlreiche Utilities, die für Producer/Consumer-Operationen gedacht sind) Paket. – shmosel
Sie möchten wahrscheinlich eine BlockingQueue, keine Liste. –
cool krank in diese schauen. Wenn ich die Liste austausche, sollte der Rest theoretisch in Ordnung sein? – Dagron