Scheduled如何會(huì)在上次任務(wù)執(zhí)行完才會(huì)執(zhí)行下次任務(wù)
Scheduled會(huì)在上次任務(wù)執(zhí)行完才會(huì)執(zhí)行下次任務(wù)
在使用spring的Scheduled定時(shí)任務(wù)
擔(dān)心同一任務(wù),
第一次開(kāi)始未執(zhí)行完就執(zhí)行第二次任務(wù),所以給加了synchronized,
但是后面經(jīng)過(guò)測(cè)試Scheduled定時(shí)任務(wù)會(huì)在上次任務(wù)結(jié)束時(shí)再執(zhí)行第二次任務(wù),
如果第二次任務(wù)堵在哪里了,時(shí)間會(huì)順延
package xyz.hashdog.job;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
/**
* @author th
* @description: 定時(shí)任務(wù)測(cè)試
* @projectName hashdog-ds
* @date 2020/2/1223:07
*/
@Component
@Slf4j
@AllArgsConstructor
public class TestCrontab {
private static final Object KEY = new Object();
private static boolean taskFlag = false;
@Scheduled(cron = "*/5 * * * * ?")
public void pushCancel() {
System.out.println("進(jìn)來(lái)了");
synchronized (KEY) {
if (TestCrontab.taskFlag) {
System.out.println("測(cè)試調(diào)度已經(jīng)啟動(dòng)");
log.warn("測(cè)試調(diào)度已經(jīng)啟動(dòng)");
return;
}
TestCrontab.taskFlag = true;
}
try {
for (int i =0;i<=10;i++){
System.out.println("執(zhí)行:"+i);
Thread.sleep(2000);
}
} catch (Exception e) {
log.error("測(cè)試調(diào)度執(zhí)行出錯(cuò)", e);
}
TestCrontab.taskFlag = false;
log.warn("測(cè)試調(diào)度執(zhí)行完成");
}
}注釋掉synchronized
執(zhí)行效果一樣,并沒(méi)有線程安全問(wèn)題
package xyz.hashdog.job;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
/**
* @author th
* @description: 定時(shí)任務(wù)測(cè)試
* @projectName hashdog-ds
* @date 2020/2/1223:07
*/
@Component
@Slf4j
@AllArgsConstructor
public class TestCrontab {
private static final Object KEY = new Object();
private static boolean taskFlag = false;
@Scheduled(cron = "*/5 * * * * ?")
public void pushCancel() throws InterruptedException {
System.out.println("進(jìn)來(lái)了");
// synchronized (KEY) {
// if (TestCrontab.taskFlag) {
// System.out.println("測(cè)試調(diào)度已經(jīng)啟動(dòng)");
// log.warn("測(cè)試調(diào)度已經(jīng)啟動(dòng)");
// return;
// }
// TestCrontab.taskFlag = true;
// }
//
// try {
for (int i =0;i<=10;i++){
System.out.println("執(zhí)行:"+i);
Thread.sleep(2000);
}
// } catch (Exception e) {
// log.error("測(cè)試調(diào)度執(zhí)行出錯(cuò)", e);
// }
//
// TestCrontab.taskFlag = false;
log.warn("測(cè)試調(diào)度執(zhí)行完成");
}
}總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
在IDEA中添加jar包到External Libraries庫(kù)的實(shí)現(xiàn)
這篇文章主要介紹了在IDEA中添加jar包到External Libraries庫(kù)的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2026-03-03
Spring數(shù)據(jù)源及配置文件數(shù)據(jù)加密實(shí)現(xiàn)過(guò)程詳解
這篇文章主要介紹了Spring數(shù)據(jù)源及配置文件數(shù)據(jù)加密實(shí)現(xiàn)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
使用Java實(shí)現(xiàn)轉(zhuǎn)換掃描的文檔為可搜索的PDF
這篇文章主要為大家詳細(xì)介紹了如何使用Java實(shí)現(xiàn)轉(zhuǎn)換掃描的文檔為可搜索的PDF,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12
java數(shù)據(jù)結(jié)構(gòu)和算法中哈希表知識(shí)點(diǎn)詳解
在本篇文章里小編給大家分享了關(guān)于java數(shù)據(jù)結(jié)構(gòu)和算法中哈希表的相關(guān)知識(shí)點(diǎn)內(nèi)容,需要的朋友們學(xué)習(xí)下。2019-06-06
使用Rhino讓java執(zhí)行javascript的方法實(shí)例
這篇文章主要介紹了java使用Rhino執(zhí)行javascript的方法,Rhino由Mozilla開(kāi)發(fā),是 JavaScript 一種基于Java的實(shí)現(xiàn)2013-12-12
Java實(shí)現(xiàn)瀏覽器大文件上傳的示例詳解
文件上傳是許多項(xiàng)目都有的功能,用戶上傳小文件速度一般都很快,但如果是大文件幾個(gè)g,幾十個(gè)g的時(shí)候,上傳了半天,馬上就要完成的時(shí)候,網(wǎng)絡(luò)波動(dòng)一下,文件又要重新上傳,所以本文給大家介紹了Java實(shí)現(xiàn)瀏覽器大文件上傳的示例,需要的朋友可以參考下2024-07-07
淺談BeanPostProcessor加載次序及其對(duì)Bean造成的影響分析
這篇文章主要介紹了淺談BeanPostProcessor加載次序及其對(duì)Bean造成的影響分析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04

