실행이 완료되는 즉시 Thread 클래스를 확장하는 RaceCar 개체를 유지하는 데 사용하려는 ArrayList가 있습니다. Race라고하는 클래스는 RaceCar 객체가 실행이 끝나면 호출하는 콜백 메서드를 사용하여이 ArrayList를 처리합니다. 콜백 메서드 인 addFinisher (RaceCar finisher)는 RaceCar 객체를 ArrayList에 추가합니다. 이것은 스레드가 실행을 완료하는 순서를 제공합니다.
ArrayList가 동기화되지 않았으므로 스레드로부터 안전하지 않습니다. 새 ArrayList를 전달하고 반환 된 Collection을 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
인터페이스는 멀티 스레딩에서 매우 유용 할만큼 충분히 완전하지 않습니다.)