我有一个包含对象的列表,我需要永久地遍历列表,同时删除或添加项目。这一切都应该发生在一个可运行的线程中。我想要的是迭代永远不会停止,同时仍然能够向它添加新对象,并删除完成的对象。
这在Java中可行吗?
答案 0 :(得分:2)
您正在描述生产者/消费者模式。 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