问题描述
我有一个 ArrayList,我想用它来保存 RaceCar 对象,这些对象在执行完后立即扩展 Thread 类.一个名为 Race 的类使用 RaceCar 对象在完成执行时调用的回调方法来处理此 ArrayList.回调方法 addFinisher(RaceCar finisher) 将 RaceCar 对象添加到 ArrayList.这应该给出线程完成执行的顺序.
I have an ArrayList that I want to use to hold RaceCar objects that extend the Thread class as soon as they are finished executing. A class, called Race, handles this ArrayList using a callback method that the RaceCar object calls when it is finished executing. The callback method, addFinisher(RaceCar finisher), adds the RaceCar object to the ArrayList. This is supposed to give the order in which the Threads finish executing.
我知道 ArrayList 不是同步的,因此不是线程安全的.我尝试通过传入一个新的 ArrayList 并将返回的 Collection 分配给一个 ArrayList 来使用 Collections.synchronizedCollection(c Collection) 方法.但是,这给了我一个编译器错误:
I know that ArrayList isn't synchronized and thus isn't thread-safe. I tried using the Collections.synchronizedCollection(c Collection) method by passing in a new ArrayList and assigning the returned Collection to an ArrayList. However, this gives me a compiler error:
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);
}
我需要知道的是,我是否使用了正确的方法,如果没有,我应该使用什么来使我的代码线程安全?感谢您的帮助!
What I need to know is, am I using a correct approach and if not, what should I use to make my code thread-safe? Thanks for the help!
推荐答案
使用 Collections.synchronizedList()
.
例如:
Collections.synchronizedList(new ArrayList<YourClassNameHere>())
这篇关于如何使我的 ArrayList 线程安全?Java 中解决问题的另一种方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!