私は春のスケジューラ(@EnableScheduling
)を使用し、毎分と呼ばれ、次の@Scheduled
方法があります。トリガー@Scheduled方法
@Component
public class ScheduledTask {
@Scheduled(fixedRate = 60*1000)
public void run() {
// ...
今はオンデマンドで、スケジューラの実行をトリガーできるようにしたいと思いますが、コード内の別の場所から
ScheduledTask
を注入してrun
メソッドを呼び出すことができます。しかし、ある時点でrun
メソッドを実行しているスレッドが1つだけであることを確認したいと思います。言い換えれば、スケジューラが現在run
を実行している場合、私はその呼び出しを無視したいと思っています。
また、run
を非同期に呼び出すこともできますが、@EnableAsync
と@Async
を使用すると簡単に対処できます。
このシナリオで使用できるSpring機能はありますか?
このコードには競合状態が含まれているため、間違っています。 2つのスレッドがまったく同時にrunメソッドを実行するとどうなりますか?例えば、thread1が 'if'で行を実行したとすると、それは真であり、thread2は同じ行を実行するとします。同期がないので、2つ以上のスレッドが 'run'メソッドを実行する可能性があります。私は 'Semaphore'クラスを使いましたが、この質問で私はここで助けてくれるSpringの施設があるかどうかを尋ねていました。 –
良い点AtomicBooleanを使って変更しました – Fernando
私はAtomicBooleanでうまくいくと思います。そこに競争条件はありません。 – Fernando