У меня есть список ArrayList, который я хочу использовать для хранения объектов RaceCar, расширяющих класс Thread, как только они закончат выполнение. Класс с именем Race обрабатывает этот список ArrayList с помощью метода обратного вызова, который объект RaceCar вызывает по завершении выполнения. Метод обратного вызова addFinisher (RaceCar Finisher) добавляет объект RaceCar в ArrayList. Это должно указать порядок, в котором потоки завершают выполнение.
Я знаю, что ArrayList не синхронизируется и, следовательно, не является потокобезопасным. Я попытался использовать метод Collections.synchronizedCollection (c Collection), передав новый ArrayList и назначив возвращенную коллекцию ArrayList. Однако это дает мне ошибку компилятора:
Race.java:41: incompatible types
found : java.util.Collection
required: java.util.ArrayList
finishingOrder = Collections.synchronizedCollection(new ArrayList(numberOfRaceCars));
Вот соответствующий код:
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);
}
Что мне нужно знать, так это то, правильно ли я использую подход, а если нет, что мне следует использовать, чтобы сделать мой код потокобезопасным? Спасибо за помощь!
List
интерфейс на самом деле недостаточно полный, чтобы быть очень полезным в многопоточности.)