Yürütme biter bitmez Thread sınıfını genişleten RaceCar nesnelerini tutmak için kullanmak istediğim bir ArrayList var. Race adlı bir sınıf, bu ArrayList'i, RaceCar nesnesinin yürütülmesi bittiğinde çağırdığı bir geri çağrı yöntemini kullanarak işler. Geri çağrı yöntemi addFinisher (RaceCar sonlandırıcı), RaceCar nesnesini ArrayList'e ekler. Bunun, Threads'ın çalışmayı bitirdiği sırayı vermesi gerekiyor.
ArrayList'in senkronize olmadığını ve bu nedenle iş parçacığı için güvenli olmadığını biliyorum. Yeni bir ArrayList içinde geçerek ve döndürülen Koleksiyonu bir ArrayList'e atayarak Collections.synchronizedCollection (c Collection) yöntemini kullanmayı denedim. Ancak, bu bana bir derleyici hatası veriyor:
Race.java:41: incompatible types
found : java.util.Collection
required: java.util.ArrayList
finishingOrder = Collections.synchronizedCollection(new ArrayList(numberOfRaceCars));
İşte ilgili kod:
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);
}
Bilmem gereken şey, doğru bir yaklaşım mı kullanıyorum ve kullanmıyorum, kodumu iş parçacığı için güvenli hale getirmek için ne kullanmalıyım? Yardım için teşekkürler!
List
arayüz çoklu iş parçacığında çok yararlı olacak kadar tam değildir.)