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

如何阻塞直到BlockingQueue为空?

法风畔
2023-03-14
问题内容

我正在寻找一种方法来阻止直到a BlockingQueue为空。

我知道,在多线程环境中,只要有生产者将项目放入BlockingQueue,就可能会出现队列变空并且几秒钟后队列中充满项目的情况。

但是,如果只有 一个 生产者,则它可能要等待(并阻止)直到队列停止为空后再将其放入队列。

Java /伪代码:

// Producer code
BlockingQueue queue = new BlockingQueue();

while (having some tasks to do) {
    queue.put(task);
}

queue.waitUntilEmpty(); // <-- how to do this?

print("Done");

你有什么主意吗?

编辑 :我知道包装BlockingQueue和使用额外的条件可以解决问题,我只是问是否有一些预制的解决方案和/或更好的选择。


问题答案:

使用wait()和的简单解决方案notify()

// Producer:
synchronized(queue) {
    while (!queue.isEmpty())
        queue.wait(); //wait for the queue to become empty
    queue.put();
}

//Consumer:
synchronized(queue) {
    queue.get();
    if (queue.isEmpty())
        queue.notify(); // notify the producer
}


 类似资料:
  • 问题内容: 我有一个类,它从中获取对象并通过连续循环调用来处理它们。在某些时候,我知道不会再有其他对象添加到队列中。如何中断该方法以使其停止阻塞? 这是处理对象的类: 这是使用此类处理对象的方法: 问题答案: 如果不能选择中断线程,则另一种方法是将“标记”或“命令”对象放在MyObjHandler可以识别的队列上,并退出循环。

  • 我已经在网上搜索了几天这种现象,我可以找到一个类似问题的片段,这表明可能与底层的InputStreamReader和/或StreamDecoder有关,但这开始超出了我的专业知识。(见本链接) 所以我的问题是,我是否正确地实现了BufferedReader,以及如何解决我所看到的问题,以便在没有不必要的延迟的情况下获得每一行。

  • 我刚刚开始学习vert. x,对它是如何工作的仍然感兴趣...我在想: 当反应性非阻塞垂直线卸载到阻塞垂直线时,阻塞垂直线在工作线程上运行。 1.what事件循环线程,关闭加载的工作,在同一时间?从循环中获取另一个事件? 返回a结果时,同一事件循环是否继续执行?还是另一个? 1的答案是什么 我觉得我错过了一些基本的东西,关于事情实际上是如何工作的。谢谢你的帮助!

  • 本文向大家介绍详解Java阻塞队列(BlockingQueue)的实现原理,包括了详解Java阻塞队列(BlockingQueue)的实现原理的使用技巧和注意事项,需要的朋友参考一下 阻塞队列 (BlockingQueue)是Java util.concurrent包下重要的数据结构,BlockingQueue提供了线程安全的队列访问方式:当阻塞队列进行插入数据时,如果队列已满,线程将会阻塞等待直

  • 问题内容: 我有一个Java ,它公开了其他线程要访问的属性: 问题是从运行到可用为止需要花费很短的时间。呼叫者可以在此之前致电并获得。我希望它们只是在初始化发生后立即阻塞,等待并获取值。(此后永远不会更改。)直到准备就绪,这将需要几毫秒的时间,因此我对这种方法感到满意。 现在,我可以做到这一点,并且有95%的机会我会做对的。但是我想知道你们所有人将如何做。有一种原始的,将做到这一点,我已经错过了

  • 我刚从Vert开始。并且想了解在处理REST HttpRequest时,处理潜在长(阻塞)操作的正确方法是什么。该应用程序本身就是一个Spring应用程序。 到目前为止,我有一个简化的REST服务: Spring配置: 现在的问题是:如何正确处理(阻止)调用我的postgresService,这可能需要更长的时间,如果有很多项目得到/返回? 在研究和查看一些示例后,我看到了一些方法,但我不完全理解