Tôi có một ArrayList mà tôi muốn sử dụng để giữ các đối tượng RaceCar mở rộng lớp Thread ngay sau khi chúng hoàn tất thực thi. Một lớp, được gọi là Race, xử lý ArrayList này bằng cách sử dụng một phương thức gọi lại mà đối tượng RaceCar gọi khi nó được thực thi xong. Phương thức gọi lại, addFinisher (Trình kết thúc RaceCar), thêm đối tượng RaceCar vào ArrayList. Điều này được cho là để đưa ra thứ tự mà các Luồng kết thúc thực thi.
Tôi biết rằng ArrayList không được đồng bộ hóa và do đó không an toàn cho chuỗi. Tôi đã thử sử dụng phương thức Collections.synchronizedCollection (c Collection) bằng cách chuyển vào ArrayList mới và gán Bộ sưu tập được trả về cho ArrayList. Tuy nhiên, điều này khiến tôi gặp lỗi trình biên dịch:
Race.java:41: incompatible types
found : java.util.Collection
required: java.util.ArrayList
finishingOrder = Collections.synchronizedCollection(new ArrayList(numberOfRaceCars));
Đây là mã liên quan:
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);
}
Những gì tôi cần biết là, tôi có đang sử dụng cách tiếp cận đúng hay không và nếu không, tôi nên sử dụng cách nào để làm cho chuỗi mã của mình an toàn? Cảm ơn đã giúp đỡ!
List
giao diện không phải là thực sự hoàn toàn đủ để thể rất hữu ích trong việc đa luồng.)