eri*_*cso 82 java collections multithreading synchronization arraylist
我有一个ArrayList,我想用它来保存RaceCar对象,一旦完成执行就会扩展Thread类.一个名为Race的类使用RaceCar对象在完成执行时调用的回调方法处理此ArrayList.回调方法addFinisher(RaceCar finisher)将RaceCar对象添加到ArrayList.这应该给出Threads完成执行的顺序.
我知道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));
Run Code Online (Sandbox Code Playgroud)
这是相关代码:
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);
}
Run Code Online (Sandbox Code Playgroud)
我需要知道的是,我使用了正确的方法,如果没有,我应该使用什么来使我的代码线程安全?谢谢您的帮助!
Ami*_*ani 130
使用Collections.synchronizedList().
例如:
Collections.synchronizedList(new ArrayList<YourClassNameHere>())
Run Code Online (Sandbox Code Playgroud)
Rev*_*nzo 35
更改
private ArrayList finishingOrder;
//Make an ArrayList to hold RaceCar objects to determine winners
finishingOrder = Collections.synchronizedCollection(new ArrayList(numberOfRaceCars)
Run Code Online (Sandbox Code Playgroud)
至
private List finishingOrder;
//Make an ArrayList to hold RaceCar objects to determine winners
finishingOrder = Collections.synchronizedList(new ArrayList(numberOfRaceCars)
Run Code Online (Sandbox Code Playgroud)
List是ArrayList的超类型,因此您需要指定它.
否则,你正在做的似乎很好.其他选项是你可以使用同步的Vector,但这可能就是我要做的.
小智 11
CopyOnWriteArrayList使用CopyOnWriteArrayList课程.这是线程安全版本ArrayList.
您可能使用了错误的方法.仅仅因为模拟汽车的一个线程在另一个汽车仿真线程之前完成并不意味着第一个线程应该赢得模拟竞赛.
这很大程度上取决于你的应用程序,但最好让一个线程以较小的时间间隔计算所有汽车的状态,直到比赛完成.或者,如果您更喜欢使用多个线程,您可能会让每辆车记录完成比赛所需的"模拟"时间,并选择获胜者作为最短时间的获胜者.
您也可以使用synchronized关键字作为这样的addFinisher方法
//Implement the one method in the RaceListener interface
public synchronized void addFinisher(RaceCar finisher) {
finishingOrder.add(finisher);
}
Run Code Online (Sandbox Code Playgroud)
因此,您可以通过这种方式使用 ArrayList 添加方法线程安全。
| 归档时间: |
|
| 查看次数: |
163201 次 |
| 最近记录: |