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

我有一个ArrayList,我想用它们来保存RaceCar对象,这些对象在执行完后立即扩展Thread类。一个名为Race的类使用RaceCar对象完成执行后调用的回调方法来处理此ArrayList。回调方法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);

    }

我需要知道的是,我使用的是正确的方法吗?如果不正确,应该使用什么使我的代码具有线程安全性?谢谢您的帮助!


小怪兽爱吃肉
浏览 714回答 3
3回答

杨魅力

使用Collections.synchronizedList()。例如:Collections.synchronizedList(new ArrayList<YourClassNameHere>())

慕的地8271018

更改private ArrayList finishingOrder;//Make an ArrayList to hold RaceCar objects to determine winnersfinishingOrder = Collections.synchronizedCollection(new ArrayList(numberOfRaceCars)至private List finishingOrder;//Make an ArrayList to hold RaceCar objects to determine winnersfinishingOrder = Collections.synchronizedList(new ArrayList(numberOfRaceCars)List是ArrayList的超类型,因此您需要指定它。否则,您正在做的事情看起来还不错。另一个选择是您可以使用Vector,它是同步的,但这可能就是我要做的。

千万里不及你

您可能使用了错误的方法。仅仅因为一个模拟汽车的线程在另一个汽车模拟线程之前完成并不意味着第一个线程应该赢得模拟比赛。这在很大程度上取决于您的应用程序,但是最好有一个线程以较小的时间间隔计算所有汽车的状态,直到比赛结束。或者,如果您希望使用多个线程,则可以让每辆汽车记录完成比赛所用的“模拟”时间,然后选择获胜者作为最短时间。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java