実行が終了したらすぐにThreadクラスを拡張するRaceCarオブジェクトを保持するために使用するArrayListがあります。Raceと呼ばれるクラスは、RaceCarオブジェクトが実行の終了時に呼び出すコールバックメソッドを使用して、このArrayListを処理します。コールバックメソッドaddFinisher(RaceCar finisher)は、RaceCarオブジェクトをArrayListに追加します。これは、スレッドが実行を終了する順序を与えることになっています。
ArrayListは同期されていないため、スレッドセーフではありません。新しいArrayListを渡し、返されたコレクションをArrayListに割り当てることで、Collections.synchronizedCollection(c Collection)メソッドを使用してみました。ただし、これによりコンパイラエラーが発生します。
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
インターフェースはマルチスレッドで非常に役立つほど完全ではありません。)