如何实现一个等待元素弹出的堆栈

Posted

技术标签:

【中文标题】如何实现一个等待元素弹出的堆栈【英文标题】:How to implement a stack that waits until element comes to make pop 【发布时间】:2016-09-05 15:21:03 【问题描述】:

我的问题与我将要描述的不同,但本质是类比。

让我们考虑一个stack。堆栈具有方法pop()。此方法从顶部移除元素并返回它。

问题

当栈中没有元素时,不要抛出异常。而是等到一个元素可以被弹出(即当一个新元素被推送时)。

我为此集思广益几个小时,以下是我想到的一些想法:

TPL 数据流 反应式扩展 SpinWait.SpinUntil()

我不确定这些是否是解决问题的好方法,但它闻起来像可观察

如何处理?

目标:在Parallel.ForEach 内消耗弹出。当资源可用时,应尽快归还。

【问题讨论】:

BlockingCollection 在 System.Collections.Concurrent;听起来像你想要的。它有一个GetConsumingEnumerable(),当与 foreach 循环一起使用时,它会在元素存在时获取元素,并在为空时等待。这些也是线程安全的。 【参考方案1】:

我认为您需要一个带有命令的队列(例如pop())。

当堆栈中没有元素时,pop() 命令不会执行,而是留在队列中。

一旦将某些内容插入堆栈,命令解释器将检查它是否可以执行命令(在您的情况下为pop())然后执行它。

如果stack 发生更改,您可以使用async 模式通知您,解释器将据此执行命令。这样您就可以避免轮询以检查堆栈状态是否已更改。

Observable Collection 似乎也是一个不错的选择。

【讨论】:

以上是关于如何实现一个等待元素弹出的堆栈的主要内容,如果未能解决你的问题,请参考以下文章

Java在Swing中如何实现弹出一个对话框的效果?

使用高效的 `has` 操作实现堆栈

模板类和向量

用堆栈实现队列

如何隐藏弹出的 UISearchController

如何仅使用堆栈来实现递归函数?