Tengo un ArrayList que quiero usar para contener objetos RaceCar que extienden la clase Thread tan pronto como terminan de ejecutarse. Una clase, llamada Race, maneja este ArrayList utilizando un método de devolución de llamada que el objeto RaceCar llama cuando termina de ejecutarse. El método de devolución de llamada, addFinisher (Finalizador RaceCar), agrega el objeto RaceCar a ArrayList. Se supone que esto da el orden en que los hilos terminan de ejecutarse.¿Cómo hago mi ArrayList Thread-Safe? ¿Otro enfoque al problema en Java?
Sé que ArrayList no está sincronizado y, por lo tanto, no es seguro para subprocesos. Intenté utilizar el método Collections.synchronizedCollection (c Collection) al pasar una nueva ArrayList y asignar la Colección devuelta a una ArrayList. Sin embargo, esto me da un error del compilador:
Race.java:41: incompatible types
found : java.util.Collection
required: java.util.ArrayList
finishingOrder = Collections.synchronizedCollection(new ArrayList(numberOfRaceCars));
Este es el código correspondiente:
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);
}
Lo que necesito saber es, estoy usando un enfoque correcto y si no, ¿qué debo usar para hacer que mi código sea seguro para subprocesos? ¡Gracias por la ayuda!
(Nota , la interfaz 'List' no es lo suficientemente completa como para ser muy útil en multihebras.) –
Me gustaría señalar que, sin' Collections.synchronizedList() ', tendremos una condición de carrera REAL aquí: P –