Java 触发器@Scheduled方法

Java 触发器@Scheduled方法,java,spring,Java,Spring,我使用Spring的调度程序(@EnableScheduling),并有以下@Scheduled方法,每分钟调用一次: @Component public class ScheduledTask { @Scheduled(fixedRate = 60*1000) public void run() { // ... 现在,我希望能够根据需要从代码中的另一个位置触发调度程序运行 我可以注入ScheduledTask,只需调用run方法。但是,我想确保在任何给定时间只有

我使用Spring的调度程序(
@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应该可以。那里没有比赛条件。