【问题标题】:When I want my threads to share an ArrayList, where do I instantiate the ArrayList, and how do I access it from the main method?当我希望我的线程共享一个 ArrayList 时,我在哪里实例化 ArrayList,以及如何从 main 方法访问它?
【发布时间】:2019-05-10 22:58:54
【问题描述】:

我希望能够在我的 main 方法中创建多个线程,让每个线程运行代码以通过在每个线程上调用 run() 来生成某些对象,然后让每个线程在完成后将这些对象添加到共享的 ArrayList 中。所以现在我有我的class Threader implements Runnable{ 和我的public class Processor,我的main 方法是唯一的方法。我的main 方法在传入我想要的相关参数时创建i 线程,然后在每个线程上调用start()。在我的Threader 类的start() 方法中,我运行了一些我编写的代码,最后创建了一个自定义Document 对象。当线程成功创建该对象时,我希望它能够将其添加到 <documents> 类型的 documents ArrayList。

所以我假设我想让 ArrayList 同步,但是我应该在哪里实例化它以便我也可以从我的 main 方法访问它?

【问题讨论】:

  • 全局变量?
  • 将其存储在Singleton?尽量不要让你的虚拟机着火。
  • 在“main”方法中创建ArrayList,将它的引用传递给您创建的每个线程。 “我假设我想让 ArrayList 同步” - 没错,ArrayList 不是线程安全的。您可以使用Collections.synchronuzedList 之类的东西,这将允许您使List 线程安全(包装在线程安全代理中),但是您必须使用List 而不是ArrayList 作为您的基本要求(记住ArrayList 实现List)
  • @MadProgrammer 所以如果我的synchronizedList被称为documents,每次我创建一个新线程时,我都将它写为Thread thread1 = new Thread(documents),那么我从任何线程添加到documents的任何东西都将是在主方法中添加到我唯一的列表中?
  • @user2709168 理论上是的。只要他们都写相同的参考文献

标签: java multithreading arraylist synchronized


【解决方案1】:

在您的main 方法中创建一个同步的List,然后您可以将其传递给main 方法创建的线程。使用像List 这样的接口而不是像ArrayList 这样的具体类作为方法中的参数可以帮助您将Threader 解耦到具体类。

在main方法中,您可以创建一个ArrayList,然后使用Collections.synchronuzedList将其转换为同步的List。

【讨论】:

  • 我想补充一点,这样做给了我一个 ConcurrentModificationException。我不得不在创建每个线程之间添加一个短暂的延迟,以通过Thread.sleep() 解决这个问题。
【解决方案2】:

在您的 Threader 类中将 List 设为静态字段,或在 main 中实例化它并将其传递给每个线程。无论哪种方式,您可能都想考虑使用同步集合,或者您必须实现自己的同步方法来添加、获取等......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 2016-02-10
    • 1970-01-01
    • 2017-03-12
    • 1970-01-01
    • 2015-10-27
    相关资源
    最近更新 更多