while(true)循环中的Java动态列表

问题描述 投票:1回答:1

我有一个包含对象的列表,我需要在项目被删除或添加时永远遍历列表。这一切都应该发生在一个可运行的线程中。我想要的是迭代永远不会停止,同时仍然能够向它添加新对象,并删除完成的对象。

  • 我想从while(true)线程添加外部的新对象。
  • 我想删除while(true)线程中的项目。
  • 它就像一个FIFO但动态。或者像一个永不停止的队列。
  • 如果列表为空,则必须等待新对象。

这在Java中可行吗?

java
1个回答
2
投票

您正在描述生产者/消费者模式。 Java有线程安全的方法来实现这一点。最简单的方法是使用java.util.concurrent.BlockingQueue<E>

使用它的方法是在Consumer(线程)和一个或多个Producer线程之间共享BlockingQueue。消费者使用E Queue.take()方法阻止。客户端使用方法Queue.offer(E)添加到Queue。

首先创建BlockingQueue:

BlockingQueue<MyObject> myQueue = new LinkedBlockingQueue<MyObject>(int capacity);

服务器线程看起来像这样:

    BlockingQueue<MyObject> myQueue;
    // A constructor which receives the BlockingQueue object

    // Main Loop
    boolean isInterrupted = false;

    while(!isInterrupted) {
        try {
            MyObject object = myQueue.take();   // Will block
            // Process object
        } catch (InterruptedException e) {
            isInterrupted = true;
        }
    }

对于每个生成器线程,将BlockingQueue对象传递给每个,并使用:

BlockingQueue<MyObject> myQueue;
// A constructor which receives the BlockingQueue object

// Create MyObjects
myQueue.offer(myObject);   // Will add to the queue

存在队列容量的概念。如果生产者添加太快队列可能达到容量。在这种情况下,报价可能会失败。有关详细信息,请参阅javadoc LinkedBlockingQueue

© www.soinside.com 2019 - 2024. All rights reserved.