0
我使用Spring的調度(@EnableScheduling
),並具有以下@Scheduled
方法,這就是所謂的每分鐘:觸發@Scheduled方法
@Component
public class ScheduledTask {
@Scheduled(fixedRate = 60*1000)
public void run() {
// ...
現在我想能夠觸發調度運行,點播,從代碼中的另一個地方。
我可以注入ScheduledTask
並且只需調用run
方法。但是我想確保在任何時候只有一個線程運行run
方法。換句話說,如果調度程序當前正在運行run
我希望呼叫被忽略。
另外我想異步調用run
,但這可以通過使用@EnableAsync
和@Async
來輕鬆解決。
在這種情況下可以使用任何Spring功能嗎?
此代碼不正確,因爲它包含競爭條件。如果兩個線程完全同時執行run方法會發生什麼?比方說,thread1用'if'執行這一行,這是真的,然後thread2執行同一行,這也是正確的。由於你沒有同步,所以有可能超過1個線程將運行'run'方法。我已經使用了「Semaphore」類,但在這個問題中,我問是否有任何Spring工具可以在這裏提供幫助。 –
我改變使用AtomicBoolean的好點 – Fernando
我認爲與AtomicBoolean你應該沒問題。那裏沒有比賽條件。 – Fernando