【问题标题】:Reading expandable arraylist in java在java中读取可扩展的arraylist
【发布时间】:2019-11-08 09:43:28
【问题描述】:

可以将元素添加到arraylist,而其他线程同时读取arraylist,得到有关此更改的通知?

例如,我在主线程中有一个数组列表。有4个元素:

    ArrayList<Integer> list = new ArrayList<>();
    list.add(1);
    list.add(2);
    list.add(3);
    list.add(4);

同时,其他线程在同一个列表中添加元素:

     Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            for (int i = 5; i < 10; i++) {
                list.add(i);
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    });
    thread.start();

现在我开始像这样阅读它们:

    for (int i : list) {
        System.out.println(i);
        Thread.sleep(2000);
    }

我想读取从 1 到 9 的所有元素,但这不起作用。我怎么能做到这一点?也许我应该在这段代码中放置同步块,但我应该在哪里?

【问题讨论】:

  • 你所说的“得到通知”是什么意思?
  • 我的意思是,在我阅读它们时,添加到其他线程中的元素将在主线程中可用。即在开始时我在arraylist中有4个元素。我正在统计迭代。但它不会在 4 停止,而是一直持续到 9。

标签: java multithreading arraylist


【解决方案1】:

这不能使用ArrayList 来完成,但听起来您需要一些队列。
为此,您可以使用Queue 的实现之一。例如,以ConcurrentLinkedQueue 为例,它可以在您的多线程扫描中运行良好。

【讨论】:

    【解决方案2】:

    java.util.concurrent 中有一个列表实现。 CopyOnWriteArrayList.

    【讨论】:

      【解决方案3】:

      即使用例不是很清楚,也不建议使用这种方法处理共享资源,但为了能够读取list 中的所有元素,您必须等待第二个@ 987654322@ 终止(因此已填充集合中的所有元素)。

      可以使用Thread#join让主线程等待thread终止:

      // ...
      thread.start();
      thread.join();
      // ...
      

      【讨论】:

        最近更新 更多