我有一个包含对象的列表,当项目被删除或被添加时,我需要通过这个列表来永远迭代。这一切都应该在一个可运行的线程中进行。我想要的是,迭代永远不会停止,同时仍然能够向其添加新的对象,并删除已完成的对象。
这在Java中是可能的吗?
发布于 2018-03-01 18:10:09
您正在描述生产者/消费者模式。Java有实现这一目标的线程安全方法。最简单的方法是使用java.util.concurrent.BlockingQueue<E>
使用它的方法是在使用者(线程)和一个或多个生产者线程之间共享BlockingQueue。使用者用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。
https://stackoverflow.com/questions/49055598
复制相似问题