J'ai une ArrayList que je veux utiliser pour contenir des objets RaceCar qui étendent la classe Thread dès qu'ils sont terminés. Une classe, appelée Race, gère cette ArrayList à l'aide d'une méthode de rappel que l'objet RaceCar appelle lorsque l'exécution est terminée. La méthode de rappel, addFinisher (finisseur RaceCar), ajoute l'objet RaceCar à ArrayList. Ceci est supposé donner l'ordre dans lequel les Threads finissent d'être exécutés.Comment rendre mon ArrayList thread-safe? Une autre approche du problème en Java?
Je sais que ArrayList n'est pas synchronisé et n'est donc pas sûr pour les threads. J'ai essayé d'utiliser la méthode Collections.synchronizedCollection (c Collection) en transmettant une nouvelle ArrayList et en affectant la Collection retournée à une ArrayList. Cependant, cela me donne une erreur de compilation:
Race.java:41: incompatible types
found : java.util.Collection
required: java.util.ArrayList
finishingOrder = Collections.synchronizedCollection(new ArrayList(numberOfRaceCars));
Voici le code correspondant:
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);
}
Ce que je dois savoir est, que j'utilise une approche correcte et sinon, que dois-je utiliser pour rendre mon code thread-safe? Merci pour l'aide!
(Note , l'interface 'List' n'est pas vraiment assez complète pour être très utile dans le multithreading.) –
Je voudrais juste souligner que, sans' Collections.synchronizedList() ', nous aurions une condition de concurrence REAL ici: P –