AHu*_*ist 9 java spring scheduled-tasks threadpool
我有一个如此安排的任务:
<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>
Run Code Online (Sandbox Code Playgroud)
我想我对计划任务如何处理池大小有误解.尽管池大小为15,但似乎只使用了一个线程.例如,如果队列中有15个事件,我认为每分钟会有15个线程检查从队列中删除事件.显然,这是错误的.
我怎样才能使用Spring的调度程序抽象在15个线程中调用此方法的时间间隔?
编辑:我想要完成的是:每半秒,我想检查是否有排队的事件要发送.完成后,我想发送最多15个(如果存在15个).如何使用java线程的弹簧抽象来实现这一点?
首先<task:scheduler/>是一个包围ScheduledThreadPoolExecutor扩展的包装器ThreadPoolExecutor.后者的JavaDoc说:
甚至核心线程最初只在新任务到达时创建和启动
其次,您必须了解计划任务(这是Java功能,而不是Spring的)不会同时运行,即使它们花费的时间比重复间隔长.他们只是等待.所以你没有15个事件在队列中等待,你有15个执行迟到并等待那个单线程.无需创建另一个,因为下一次执行必须等待前一个完成.同样,这就是Java调度框架的工作原理.
当然,如果您安排了多个不同的任务,则会创建更多的线程.
Springtask:scheduler默认情况下是一个 bean 属性包装器java.util.concurrent.ThreadPoolExecutor:
corePoolSize - 池中保留的线程数,即使它们处于空闲状态。
这并不能保证该pools-size属性相当于具有该数量的活动线程。另一方面,您应该注意,在任何给定时间点,线程的最大数量只能等于您正在使用的计算机上的处理核心数;即所有其他线程将等待切换到RUNNING模式并继续执行。
另外,在 Spring 的文档中,它提到如果这不是您所需要的,您也可以利用ConcurrentTaskExecutor.
| 归档时间: |
|
| 查看次数: |
12800 次 |
| 最近记录: |