如何中断在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

回到顶部