Eu tenho uma ArrayList que desejo usar para conter objetos RaceCar que estendem a classe Thread assim que sua execução for concluída. Uma classe, chamada Race, trata este ArrayList usando um método de retorno de chamada que o objeto RaceCar chama quando termina de ser executado. O método de retorno de chamada, addFinisher (RaceCar finisher), adiciona o objeto RaceCar ao ArrayList. Isso deve fornecer a ordem na qual os Threads terminam de ser executados.
Eu sei que ArrayList não está sincronizado e, portanto, não é seguro para thread. Tentei usar o método Collections.synchronizedCollection (c Collection) passando uma nova ArrayList e atribuindo a coleção retornada a uma ArrayList. No entanto, isso me dá um erro de compilador:
Race.java:41: incompatible types
found : java.util.Collection
required: java.util.ArrayList
finishingOrder = Collections.synchronizedCollection(new ArrayList(numberOfRaceCars));
Aqui está o código relevante:
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);
}
O que preciso saber é se estou usando uma abordagem correta e, se não, o que devo usar para tornar meu código thread-safe? Obrigado pela ajuda!
List
interface não é realmente completa o suficiente para ser muito útil em multithreading.)