Mam ArrayList, którego chcę użyć do przechowywania obiektów RaceCar, które rozszerzają klasę Thread, gdy tylko zostaną zakończone. Klasa o nazwie Race obsługuje tę ArrayList przy użyciu metody wywołania zwrotnego, którą obiekt RaceCar wywołuje po zakończeniu wykonywania. Metoda wywołania zwrotnego addFinisher (RaceCar finisher) dodaje obiekt RaceCar do ArrayList. Ma to na celu zapewnienie kolejności, w jakiej wątki kończą wykonywanie.
Wiem, że ArrayList nie jest zsynchronizowany, a zatem nie jest bezpieczny dla wątków. Próbowałem użyć metody Collections.synchronizedCollection (c Collection), przekazując nową ArrayList i przypisując zwróconą Collection do ArrayList. Jednak to daje mi błąd kompilatora:
Race.java:41: incompatible types
found : java.util.Collection
required: java.util.ArrayList
finishingOrder = Collections.synchronizedCollection(new ArrayList(numberOfRaceCars));
Oto odpowiedni kod:
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);
}
Muszę wiedzieć, czy stosuję poprawne podejście, a jeśli nie, czego należy użyć, aby mój kod był bezpieczny dla wątków? Dzięki za pomoc!
List
interfejs nie jest na tyle kompletny, aby był bardzo przydatny w wielowątkowości.)