У мене є ArrayList, який я хочу використовувати для зберігання об’єктів RaceCar, які розширюють клас Thread, як тільки вони закінчаться. Клас, званий Race, обробляє цей ArrayList, використовуючи метод зворотного виклику, який викликає об'єкт RaceCar, коли його завершення виконується. Метод зворотного виклику, addFinisher (фінішер RaceCar), додає об’єкт 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
інтерфейс насправді недостатньо повний, щоб бути дуже корисним у багатопотоковості.)