如何使我的ArrayList线程安全?另一种解决Java中的问题的方法? [英] How do I make my ArrayList Thread-Safe? Another approach to problem in Java?

查看:145
本文介绍了如何使我的ArrayList线程安全?另一种解决Java中的问题的方法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个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不是同步的,因此不是线程安全的。我试图使用Collections.synchronizedCollection(c集合)方法通过传入一个新的ArrayList并将返回的集合分配给一个ArrayList。但是,这给我一个编译器错误:

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中的问题的方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆