如何中断在take()上阻塞的BlockingQueue?
我有一个类,它从中获取对象BlockingQueue
并通过take()
连续循环调用来处理它们。在某些时候,我知道不会再有其他对象添加到队列中。如何中断该take()
方法以使其停止阻塞?
这是处理对象的类:
public class MyObjHandler implements Runnable { private final BlockingQueue<MyObj> queue;
public class MyObjHandler(BlockingQueue queue) {
this.queue = queue;
}
public void run() {
try {
while (true) {
MyObj obj = queue.take();
// process obj here
// ...
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
这是使用此类处理对象的方法:
public void testHandler() { BlockingQueue<MyObj> queue = new ArrayBlockingQueue<MyObj>(100);
MyObjectHandler handler = new MyObjectHandler(queue);
new Thread(handler).start();
// get objects for handler to process
for (Iterator<MyObj> i = getMyObjIterator(); i.hasNext(); ) {
queue.put(i.next());
}
// what code should go here to tell the handler
// to stop waiting for more objects?
}
回答:
如果不能选择中断线程,则另一种方法是将“标记”或“命令”对象放在MyObjHandler可以识别的队列上,并退出循环。
以上是 如何中断在take()上阻塞的BlockingQueue? 的全部内容, 来源链接: utcz.com/qa/420434.html