![]() |
1
12
原始(大部分已更改;请参阅下面的更新)
基于一些
suggestions
(谢谢!)属于
Glenn Maynard
这个
这对于单个生产者为一个或多个消费者生成数据的情况非常有用,但对于消费者等待特定项目或项目集的多重安排也非常有用。特别是它没有提供一种方法来确定所有的生产商都已经完成了生产。要实现这一目标,就必须提供某种方式来登记生产者(
*:在这里,我松散地使用术语“mixin”。作为
CloseableQueue
模块现在提供
更新2
评论和批评是受欢迎的,特别是来自这个答案的匿名选民。 |
![]() |
3
7
哨兵是关闭队列的一种自然方式,但有几件事需要注意。 首先,记住您可能有多个消费者,因此您需要为每个正在运行的消费者发送一次sentinel,并保证每个消费者只消耗一个sentinel,以确保每个消费者收到其关机sentinel。 第二,记住Queue定义了一个接口,如果可能,代码的行为应该与底层队列无关。您可能有一个PriorityQueue,或者可能有其他类公开同一接口并以其他顺序返回值。
不幸的是,很难同时处理这两个问题。为了处理不同队列的一般情况,正在关闭的使用者必须在接收到其shutdown sentinel之后继续使用值,直到队列为空。这意味着它可能会消耗另一个线程的哨兵。这是队列接口的一个弱点:它应该有一个
因此,在实践中:
|
![]() |
4
2
如果您不希望使用者线程在作业完成后终止,则将sentinel值放入队列以终止任务。 |
![]() |
5
0
您的建议是:检查队列以查看是否定期执行,这是非常不可取的。轮询是多线程编程中的反模式,您应该始终使用通知。
编辑:
|
![]() |
lio · Java实例化Queueadt的实现 6 年前 |
![]() |
Invictus97k · c编程、队列和模块问题 6 年前 |
![]() |
Gameatro · 为什么malloc在函数内部调用时返回空指针? 7 年前 |
![]() |
Ahsan Tarique · 队列实现错误C++[重复] 7 年前 |
![]() |
aknosis · 为多个队列共享单个laravel数据库表 7 年前 |
![]() |
T.Sh · Elastix自定义配置文件 7 年前 |