gpt4 book ai didi

Java 并发 : Threads notifications

转载 作者:行者123 更新时间:2023-11-29 06:07:00 25 4
gpt4 key购买 nike

我有一个 java 并发问题,它是这样的:有一个 Servlet (serv1) 将对象(表示消息)存储到数据库中。还有一个线程 (t1) 查找(在数据库中)未发送的消息并传递它们。 t1 每 5 分钟运行一次,因此,为了提高效率,serv1 会在每次存储消息时通知 t1

问题是:在 serv1 收到大量请求并因此 t1 收到如此多的通知以至于它会模拟一个“while (true)”?

另一个问题:如果 serv1 想要通知 t1t1 已经唤醒/正在运行,通知过程将如何表现?

提前致谢!

最佳答案

我不认为这是一个问题@Wilmer。我怀疑与使用和处理消息的成本相比,通知本身相对便宜。如果您正在使用消息,那么删除通知不会帮助该过程,您将不得不以某种方式阻止您的 serv1 线程或卸载作业以便稍后运行。

就通知而言,如果没有人在等待,则 notify() 实际上是空操作。这就是为什么在 等待信号之前检查是否有任何要处理的东西很重要——所有这些都在同步块(synchronized block)中。最好的做法是 循环 等待并在我们收到通知时再次检查。看这个race condition .

一般来说,这是一种非常的常见做法,几乎所有producer/consumer thread models 都使用了这种做法。我见过的。备选方案是不处理方波流量变化。您的消费者 (t1) 等待时间过长,缓冲区已满,或者它旋转过多,消费者使用过多 CPU 检查数据库。

另一件需要考虑的事情是不使用数据库,而是将对象放入BlockingQueue 以供t1 直接使用。如果您需要将它们存储在数据库中,则将对象的 ID 放入队列中以供 t1 使用。线程仍需要在启动时轮询数据库,但您将在稍后的过程中保存轮询。

关于Java 并发 : Threads notifications,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8217633/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com