为了账号安全,请及时绑定邮箱和手机立即绑定

如何使ArrayList成为线程安全的?用Java解决问题的另一种方法?

如何使ArrayList成为线程安全的?用Java解决问题的另一种方法?

小怪兽爱吃肉 2019-10-18 14:24:40
我有一个ArrayList,我想用它们来保存RaceCar对象,这些对象在执行完后立即扩展Thread类。一个名为Race的类使用RaceCar对象完成执行后调用的回调方法来处理此ArrayList。回调方法addFinisher(RaceCar finisher)将RaceCar对象添加到ArrayList。这应该给出线程完成执行的顺序。我知道ArrayList不同步,因此不是线程安全的。我尝试使用Collections.synchronizedCollection(c Collection)方法,方法是传入一个新的ArrayList并将返回的Collection分配给ArrayList。但是,这给了我一个编译器错误:Race.java:41: incompatible typesfound   : java.util.Collectionrequired: java.util.ArrayListfinishingOrder = 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);    }我需要知道的是,我使用的是正确的方法吗?如果不正确,应该使用什么使我的代码具有线程安全性?谢谢您的帮助!
查看完整描述

3 回答

?
杨魅力

TA贡献1811条经验 获得超6个赞

使用Collections.synchronizedList()。


例如:


Collections.synchronizedList(new ArrayList<YourClassNameHere>())


查看完整回答
反对 回复 2019-10-18
?
慕的地8271018

TA贡献1796条经验 获得超4个赞

更改


private ArrayList finishingOrder;


//Make an ArrayList to hold RaceCar objects to determine winners

finishingOrder = Collections.synchronizedCollection(new ArrayList(numberOfRaceCars)


private List finishingOrder;


//Make an ArrayList to hold RaceCar objects to determine winners

finishingOrder = Collections.synchronizedList(new ArrayList(numberOfRaceCars)

List是ArrayList的超类型,因此您需要指定它。


否则,您正在做的事情看起来还不错。另一个选择是您可以使用Vector,它是同步的,但这可能就是我要做的。


查看完整回答
反对 回复 2019-10-18
?
千万里不及你

TA贡献1784条经验 获得超9个赞

可能使用了错误的方法。仅仅因为一个模拟汽车的线程在另一个汽车模拟线程之前完成并不意味着第一个线程应该赢得模拟比赛。

这在很大程度上取决于您的应用程序,但是最好有一个线程以较小的时间间隔计算所有汽车的状态,直到比赛结束。或者,如果您希望使用多个线程,则可以让每辆汽车记录完成比赛所用的“模拟”时间,然后选择获胜者作为最短时间。


查看完整回答
反对 回复 2019-10-18
  • 3 回答
  • 0 关注
  • 713 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信