gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:14:21 30 4
gpt4 key购买 nike

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

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

这在 Java 中可能吗?

最佳答案

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

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

首先创建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了解完整详情

关于Java while(true) 循环中的动态列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49055598/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com