Ich habe eine ArrayList, mit der ich RaceCar-Objekte speichern möchte, die die Thread-Klasse erweitern, sobald die Ausführung abgeschlossen ist. Eine Klasse namens Race verarbeitet diese ArrayList mithilfe einer Rückrufmethode, die das RaceCar-Objekt nach Abschluss der Ausführung aufruft. Die Rückrufmethode addFinisher (RaceCar-Finisher) fügt das RaceCar-Objekt zur ArrayList hinzu. Dies soll die Reihenfolge angeben, in der die Ausführung der Threads beendet ist.
Ich weiß, dass ArrayList nicht synchronisiert und daher nicht threadsicher ist. Ich habe versucht, die Methode Collections.synchronizedCollection (c Collection) zu verwenden, indem ich eine neue ArrayList übergeben und die zurückgegebene Collection einer ArrayList zugewiesen habe. Dies gibt mir jedoch einen Compilerfehler:
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 muss ist, verwende ich einen korrekten Ansatz und wenn nicht, was sollte ich verwenden, um meinen Code threadsicher zu machen? Danke für die Hilfe!
Collections.synchronizedList()
wir ohne hier eine WIRKLICHE Rennbedingung hätten: P
List
Benutzeroberfläche nicht vollständig genug ist, um beim Multithreading sehr nützlich zu sein.)