Я использую планировщик весны (@EnableScheduling
) и имеют следующий @Scheduled
метод, который вызывается каждую минуту:Trigger @Scheduled метод
@Component
public class ScheduledTask {
@Scheduled(fixedRate = 60*1000)
public void run() {
// ...
Теперь я хотел бы иметь возможность запускать планировщик перспективе, по требованию, из другого места в коде.
Я могу ввести ScheduledTask
и просто вызвать метод run
. Тем не менее, я хочу убедиться, что в данный момент существует только один поток, выполняющий метод run
. Другими словами, если планировщик в настоящий момент запущен run
Я хочу, чтобы вызов был проигнорирован.
Также я хочу называть run
асинхронно, но это можно легко решить, используя @EnableAsync
и @Async
.
Есть ли какая-либо функция Spring, которая может быть использована в этом сценарии?
Этот код является неправильным, так как содержит условие гонки. Что произойдет, если два потока выполняют метод запуска точно в одно и то же время? Предположим, что thread1 выполняет строку с 'if', это правда, тогда thread2 выполняет ту же строку, это также верно. Поскольку у вас нет синхронизации, возможно, что более 1 потока будет запускать метод 'run'. Я использовал класс «Семафор», но в этом вопросе я спрашивал, есть ли какие-либо средства Spring, которые могут помочь здесь. –
Хорошая точка, которую я изменил с помощью AtomicBoolean – Fernando
Я думаю, что с AtomicBoolean вы должны быть в порядке. Там нет условий гонки. – Fernando