首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在take()上中断阻塞的BlockingQueue?

如何在take()上中断阻塞的BlockingQueue?
EN

Stack Overflow用户
提问于 2009-05-01 17:24:36
回答 3查看 42.8K关注 0票数 89

我有一个类,它从BlockingQueue中获取对象,并通过在连续循环中调用take()来处理它们。在某种程度上,我知道不会再有对象被添加到队列中。如何中断take()方法,使其停止阻塞?

下面是处理对象的类:

代码语言:javascript
复制
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();
    }
  }
}

下面是使用这个类处理对象的方法:

代码语言:javascript
复制
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?
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-05-01 17:29:25

如果不能中断线程,另一种方法是在队列上放置一个“标记”或“命令”对象,该对象将被MyObjHandler识别并跳出循环。

票数 77
EN

Stack Overflow用户

发布于 2009-05-01 17:27:10

代码语言:javascript
复制
BlockingQueue<MyObj> queue = new ArrayBlockingQueue<MyObj>(100);
MyObjectHandler handler = new MyObjectHandler(queue);
Thread thread = new Thread(handler);
thread.start();
for (Iterator<MyObj> i = getMyObjIterator(); i.hasNext(); ) {
  queue.put(i.next());
}
thread.interrupt();

但是,如果这样做,当队列中仍有等待处理的项时,线程可能会中断。您可能希望考虑使用poll而不是take,这将允许处理线程在等待一段时间没有新输入时超时并终止。

票数 14
EN

Stack Overflow用户

发布于 2009-05-01 17:28:00

中断线程:

代码语言:javascript
复制
thread.interrupt()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/812342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档