当前位置: 首页 > 面试题库 >

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

宰父智敏
2023-03-14
问题内容

我有一个类,它从中获取对象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可以识别的队列上,并退出循环。



 类似资料:
  • 我想使用ExecutorService框架解决一些DNS任务。我使用java API进行DNS查询:1/java.net.InetSocketAddress.InetSocketAddress(String,int)-名称查找2/java.net.InetAddress.getByName(String)-名称查找3/java.net.InetAddress.getHostName()-反向名称查

  • 我正在编写一个有3个线程的程序。一个读取一个文本文件并将单词输入到大小为2的ArraylistBlockingQueue中。下一个获取该列表并反转其中的每个其他单词。最后一个线程获取单词并将它们写入一个新的文本文件。 我所有的东西都在工作,除了我不知道如何中断和停止我的线程。程序写入文本文件,但从未结束。 主要方法 输入 反向类@重写公共void run(){ 输出代码@覆盖公共无效run(){

  • 如另一个问题中所述,当使用Undertow时,所有处理都应该在专用的工作线程池中完成,如下所示: 我知道可用于显式地告诉Undertow在专用的线程池中调度请求以阻止请求。我们可以通过将包装在实例中来修改上面的示例,如下所示: 调用此方法将exchange置于阻塞模式,并创建一个BlockingHttpExchange对象来存储流。当交换处于阻塞模式时,输入流方法变得可用,除了阻塞和非阻塞模式之间

  • 问题内容: 我有一个在后台运行的线程正在以阻塞方式从输入设备读取事件,现在当我退出应用程序时,我想正确清理线程,但是我不能只运行pthread_join(),因为该线程由于IO阻塞而永远不会退出。 我如何正确解决这种情况?我应该发送一个pthread_kill(theard,SIGIORM)还是一个pthread_kill(theard,SIGALRM)来中断该块?那两个信号是否正确?还是有另一种

  • 编辑: 主要问题:为什么只有一个线程抛出interruptedexception,而两个线程都阻塞在条件上。await 所以下面的代码只是我创建的一个示例。主要的问题是开发一个生产者-消费者实现,在这个实现中,我必须创建一个模拟类,它产生两种线程:客户线程和厨师线程,这两种线程是基于可重入锁进行同步的。在执行一些操作(客户添加订单,厨师执行服务这些订单)后,我调用客户线程上的join以确保所有订单

  • 问题内容: 根据我在这里所读的内容,golang调度程序将自动确定goroutine是否在I / O上阻塞,并将自动切换为在未阻塞的线程上处理其他goroutine。 我想知道的是调度程序如何确定该goroutine已停止阻止I / O。 它是否只是经常进行某种轮询以检查其是否仍处于阻塞状态?是否运行某种后台线程来检查所有goroutine的状态? 例如,如果要在需要5s的goroutine中执行