在Java中读取可扩展的arraylist

是否可以在其他线程同时向arraylist中添加元素,同时读取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的所有元素,但这是行不通的。我怎样才能做到这一点?也许我应该在代码中放入同步块,但是我应该在哪里?

wsw123wsw1 回答:在Java中读取可扩展的arraylist

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

,

使用ArrayList不能完成此操作,但听起来您需要一些队列。
为此,您可以使用Queue的一种实现。例如,使用ConcurrentLinkedQueue可以在多线程scanario中很好地工作。

,

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

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

// ...
thread.start();
thread.join();
// ...
本文链接:https://www.f2er.com/3138991.html

大家都在问