Ho un ArrayList che desidero utilizzare per contenere oggetti RaceCar che estendono la classe Thread non appena hanno terminato l'esecuzione. Una classe, denominata Race, gestisce questo ArrayList utilizzando un metodo di callback che l'oggetto RaceCar chiama al termine dell'esecuzione. Il metodo di callback, addFinisher (RaceCar finisher), aggiunge l'oggetto RaceCar all'ArrayList. Questo dovrebbe fornire l'ordine in cui i thread terminano l'esecuzione.
So che ArrayList non è sincronizzato e quindi non è thread-safe. Ho provato a utilizzare il metodo Collections.synchronizedCollection (c Collection) passando un nuovo ArrayList e assegnando la Collection restituita a un ArrayList. Tuttavia, questo mi dà un errore del compilatore:
Race.java:41: incompatible types
found : java.util.Collection
required: java.util.ArrayList
finishingOrder = Collections.synchronizedCollection(new ArrayList(numberOfRaceCars));
Ecco il codice pertinente:
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);
}
Quello che devo sapere è se sto usando un approccio corretto e, in caso contrario, cosa dovrei usare per rendere il mio codice thread-safe? Grazie per l'aiuto!
List
interfaccia non è abbastanza completa per essere molto utile nel multithreading.)