ฉันมี ArrayList ที่ฉันต้องการใช้เพื่อเก็บวัตถุ RaceCar ที่ขยายคลาสเธรดทันทีที่ดำเนินการเสร็จสิ้น คลาสที่เรียกว่า Race จะจัดการ ArrayList นี้โดยใช้วิธีการเรียกกลับที่อ็อบเจ็กต์ RaceCar เรียกใช้เมื่อดำเนินการเสร็จสิ้น วิธีการโทรกลับ addFinisher (RaceCar finisher) เพิ่มวัตถุ RaceCar ไปยัง ArrayList สิ่งนี้ควรจะให้ลำดับที่เธรดดำเนินการเสร็จสิ้น
ฉันรู้ว่า ArrayList ไม่ซิงโครไนซ์ดังนั้นจึงไม่ปลอดภัยต่อเธรด ฉันลองใช้เมธอด Collections.synchronizedCollection (c Collection) โดยส่ง ArrayList ใหม่และกำหนด Collection ที่ส่งคืนไปยัง ArrayList อย่างไรก็ตามสิ่งนี้ทำให้ฉันมีข้อผิดพลาดของคอมไพเลอร์:
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
อินเทอร์เฟซยังไม่สมบูรณ์เพียงพอที่จะเป็นประโยชน์อย่างมากในการใช้งานมัลติเธรด)