Saya memiliki ArrayList yang ingin saya gunakan untuk menampung objek RaceCar yang memperluas kelas Thread segera setelah selesai dijalankan. Sebuah kelas, yang disebut Race, menangani ArrayList ini menggunakan metode callback yang dipanggil oleh objek RaceCar saat selesai dijalankan. Metode callback, addFinisher (RaceCar finisher), menambahkan objek RaceCar ke ArrayList. Ini seharusnya memberi urutan di mana Threads selesai dieksekusi.
Saya tahu bahwa ArrayList tidak disinkronkan dan karenanya tidak aman untuk thread. Saya mencoba menggunakan metode Collections.synchronizedCollection (c Collection) dengan meneruskan ArrayList baru dan menetapkan Collection yang dikembalikan ke ArrayList. Namun, ini memberi saya kesalahan kompiler:
Race.java:41: incompatible types
found : java.util.Collection
required: java.util.ArrayList
finishingOrder = Collections.synchronizedCollection(new ArrayList(numberOfRaceCars));
Berikut adalah kode yang relevan:
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);
}
Yang perlu saya ketahui adalah, apakah saya menggunakan pendekatan yang benar dan jika tidak, apa yang harus saya gunakan untuk membuat kode saya aman untuk thread? Terima kasih untuk bantuannya!
List
antarmuka tidak cukup lengkap untuk menjadi sangat berguna dalam multithreading.)