gpt4 book ai didi

java - 池大小实际上如何与 Spring 的计划任务一起工作?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:47:06 24 4
gpt4 key购买 nike

我有一个这样安排的任务:

<task:scheduler id="notification.scheduler" pool-size="15" />

<task:scheduled-tasks scheduler="notification.scheduler">
<task:scheduled ref="notificationProcessor" method="sendNextQueueEvent" fixed-rate="500" />
<task:scheduled ref="notificationProcessor" method="deleteNextCompletedEvent" fixed-rate="60000" />
</task:scheduled-tasks>

我想我对计划任务如何与池大小一起工作有误解。尽管池大小为 15,但似乎只使用了一个线程。例如,如果队列中有 15 个事件,我认为每分钟会有 15 个线程检查以从队列中删除一个事件。显然,这是错误的。

我怎样才能使用 Spring 的调度程序抽象让 15 个线程在时间间隔内调用此方法?

编辑:我想要完成的是:每隔半秒,我想检查是否有排队的事件要发送。完成后,我想发送最多 15 个(如果存在 15 个)。我将如何使用 java 线程的 spring 抽象来实现这一点?

最佳答案

首先<task:scheduler/>ScheduledThreadPoolExecutor 的包装器扩展 ThreadPoolExecutor .后者的 JavaDoc 说:

even core threads are initially created and started only when new tasks arrive

其次,您必须了解计划任务(这是一个 Java 特性,而不是 Spring 的)不会并发运行,即使它们花费的时间比重复间隔更长。他们只是等待。所以你没有 15 个事件在队列中等待,你有 15 个延迟执行并等待那个线程。无需创建另一个,因为下一次执行必须等待前一个执行完成。同样,这就是 Java 调度框架的工作方式。

当然,如果您安排了多个不同的任务,则会创建更多线程。

关于java - 池大小实际上如何与 Spring 的计划任务一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10251328/

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