首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java动态列表在while(true)循环中的应用

Java动态列表在while(true)循环中的应用
EN

Stack Overflow用户
提问于 2018-03-01 17:38:01
回答 1查看 391关注 0票数 1

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

  • 我希望从while(true)线程中从外部添加新对象。
  • 我想删除while(true)线程中的项。
  • 就像一个先进先出但充满活力。或者像一个永不停歇的队列。
  • 如果列表为空,则必须等待新对象。

这在Java中是可能的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-01 18:10:09

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

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

首先创建BlockingQueue:

代码语言:javascript
运行
复制
BlockingQueue<MyObject> myQueue = new LinkedBlockingQueue<MyObject>(int capacity);

服务器线程将如下所示:

代码语言:javascript
运行
复制
    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对象传递给每个线程,并使用:

代码语言:javascript
运行
复制
BlockingQueue<MyObject> myQueue;
// A constructor which receives the BlockingQueue object

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49055598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档