Java 触发器@Scheduled方法
我使用Spring的调度程序(Java 触发器@Scheduled方法,java,spring,Java,Spring,我使用Spring的调度程序(@EnableScheduling),并有以下@Scheduled方法,每分钟调用一次: @Component public class ScheduledTask { @Scheduled(fixedRate = 60*1000) public void run() { // ... 现在,我希望能够根据需要从代码中的另一个位置触发调度程序运行 我可以注入ScheduledTask,只需调用run方法。但是,我想确保在任何给定时间只有
@EnableScheduling
),并有以下@Scheduled
方法,每分钟调用一次:
@Component
public class ScheduledTask {
@Scheduled(fixedRate = 60*1000)
public void run() {
// ...
现在,我希望能够根据需要从代码中的另一个位置触发调度程序运行
我可以注入ScheduledTask
,只需调用run
方法。但是,我想确保在任何给定时间只有一个线程运行run
方法。换句话说,如果计划程序当前正在运行run
,我希望调用被忽略
我还想异步调用run
,但这可以通过使用@EnableAsync
和@Async
轻松解决
是否有任何Spring功能可用于此场景?自注释起编辑:
只需使用原子布尔
@Component
public class ScheduledTask {
private AtomicBoolean isRunning = new AtomicBoolean(false);
@Scheduled(fixedRate = 60*1000)
public void run() {
if (isRunning.compareAndSet(false, true)) {
// ... do your things
//whenever you are done
isRunning.set(false);
}
我认为春天没有比这更简单的事情了。这是没有意义的,因为它实际上是一个旗帜的东西
编辑:
如果您想在应用程序的几个地方使用它,请考虑使用信号量或原子布尔嵌入来实现自己的注释。p> 此代码不正确,因为它包含竞争条件。如果两个线程同时执行run方法,会发生什么情况?假设thread1执行带有
的行,如果
,则为true,然后thread2执行相同的行,也为true。由于没有同步,可能会有多个线程运行run
方法。我使用了Semaphore
类,但在这个问题中,我问是否有任何Spring工具可以在这里提供帮助。我认为使用AtomicBoolean应该可以。那里没有比赛条件。