Ich habe eine ArrayList, die ich verwenden möchte, um RaceCar-Objekte zu halten, die die Thread-Klasse erweitern, sobald sie mit der Ausführung fertig sind. Eine Klasse namens Race behandelt diese ArrayList mit einer Callback-Methode, die das RaceCar-Objekt aufruft, wenn die Ausführung abgeschlossen ist. Die Callback-Methode addFinisher (RaceCar-Finisher) fügt der ArrayList das RaceCar-Objekt hinzu. Dies soll die Reihenfolge angeben, in der die Threads die Ausführung beenden.Wie mache ich meine ArrayList Thread-Safe? Ein anderer Ansatz für Probleme in Java?
Ich weiß, dass ArrayList nicht synchronisiert ist und somit nicht Thread-sicher ist. Ich habe versucht, die Collections.synchronizedCollection (c Collection) -Methode zu verwenden, indem ich eine neue ArrayList übergeben und die zurückgegebene Collection einer ArrayList zuweisen. Aber das gibt mir einen Compiler-Fehler:
Race.java:41: incompatible types
found : java.util.Collection
required: java.util.ArrayList
finishingOrder = Collections.synchronizedCollection(new ArrayList(numberOfRaceCars));
Hier ist der relevante Code:
public class Race implements RaceListener {
private Thread[] racers;
private ArrayList finishingOrder;
//Make an ArrayList to hold RaceCar objects to determine winners
finishingOrder = Collections.synchronizedCollection(new ArrayList(numberOfRaceCars));
//Fill array with RaceCar objects
for(int i=0; i<numberOfRaceCars; i++) {
racers[i] = new RaceCar(laps, inputs[i]);
//Add this as a RaceListener to each RaceCar
((RaceCar) racers[i]).addRaceListener(this);
}
//Implement the one method in the RaceListener interface
public void addFinisher(RaceCar finisher) {
finishingOrder.add(finisher);
}
Was ich wissen muß, ist, bin ich einen richtigen Ansatz, und wenn nicht, was soll ich verwenden um meinen Code threadsicher zu machen? Danke für die Hilfe!
(Hinweis , die 'List'-Schnittstelle ist nicht wirklich vollständig genug, um beim Multithreading sehr nützlich zu sein.) –
Ich möchte nur darauf hinweisen, dass wir ohne 'Collections.synchronizedList()' hier eine ECHTE Race Condition haben: P –