最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring @Scheduled注解及工作原理

 更新時(shí)間:2025年06月18日 11:38:32   作者:玄魄靈歸  
Spring的@Scheduled注解用于標(biāo)記定時(shí)任務(wù),無(wú)需額外庫(kù),需配置@EnableScheduling,設(shè)置fixedRate、fixedDelay或cron,基于TaskScheduler,默認(rèn)使用線程池,可自定義線程數(shù)及名稱以優(yōu)化性能,本文給大家介紹Spring @Scheduled注解的相關(guān)知識(shí),感興趣的朋友一起看看吧

1.@Scheduled注解定義

簡(jiǎn)單來(lái)說(shuō), @Scheduled是 Spring 提供的一個(gè)注解,用于在方法上標(biāo)記定時(shí)任務(wù)。通過(guò)它,我們可以輕松地在指定的時(shí)間間隔或特定的時(shí)間點(diǎn)執(zhí)行某些代碼,而不需要引入額外的定時(shí)任務(wù)庫(kù)。

舉個(gè)例子:
假設(shè)你有一個(gè)方法需要每隔5分鐘執(zhí)行一次,你只需要在方法上加上 @Scheduled注解,并設(shè)置相應(yīng)的屬性即可。

2.配置 @Scheduled

在開(kāi)始使用 @Scheduled 之前,我們需要做一些配置工作。首先,確保你的 Spring 項(xiàng)目中引入了 spring-boot-starter,因?yàn)樗呀?jīng)包含了必要的依賴。

2.1 開(kāi)啟定時(shí)任務(wù)支持

在你的主類(通常標(biāo)注了 @SpringBootApplication 的類)上添加@EnableScheduling注解,以啟用定時(shí)任務(wù)的支持。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling
public class ScheduledDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(ScheduledDemoApplication.class, args);
    }
}

2.2 創(chuàng)建定時(shí)任務(wù)

接下來(lái),我們創(chuàng)建一個(gè)服務(wù)類,并在其中定義一個(gè)定時(shí)任務(wù)方法。例如,每隔5秒打印一條消息:

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class ScheduledTasks {
    @Scheduled(fixedRate = 5000)
 public void reportCurrentTime() {
        System.out.println("每5秒執(zhí)行一次任務(wù),當(dāng)前時(shí)間:" + System.currentTimeMillis());
    }
}

3. 常用屬性

@Scheduled 注解提供了多種方式來(lái)配置定時(shí)任務(wù)的執(zhí)行時(shí)間,主要包括以下幾種

3.1 fixedRate

指定一個(gè)固定的時(shí)間間隔,以毫秒為單位,表示上一次任務(wù)開(kāi)始執(zhí)行后,多久再次執(zhí)行。

@Scheduled(fixedRate = 5000) // 每5秒執(zhí)行一次
public void fixedRateTask() {
    System.out.println("Fixed Rate Task - " + System.currentTimeMillis());
}

3.2 fixedDelay

指定一個(gè)固定的時(shí)間間隔,表示上一次任務(wù)執(zhí)行完成后,等待多久再次執(zhí)行。

@Scheduled(fixedDelay = 5000) // 上一次任務(wù)完成后5秒執(zhí)行一次
public void fixedDelayTask() {
    System.out.println("Fixed Delay Task - " + System.currentTimeMillis());
}

3.3 cron

使用 cron 表達(dá)式確地指定任務(wù)的執(zhí)行時(shí)間。cron 表達(dá)式可以讓你定義復(fù)雜的時(shí)間計(jì)劃。

@Scheduled(cron = "0 0/1 * * * ?") // 每分鐘執(zhí)行一次
public void cronTask() {
    System.out.println("Cron Task - " + System.currentTimeMillis());
}

4.工作原理

了解了如何使用 @Scheduled,那么它背后到底是如何運(yùn)作的呢?讓我們來(lái)深入探討一下。

4.1 基于TaskScheduler

Spring 的定時(shí)任務(wù)是基于 TaskScheduler 接口實(shí)現(xiàn)的。當(dāng)我們?cè)诜椒ㄉ鲜褂?@Scheduled 注解時(shí),Spring 會(huì)自動(dòng)為其創(chuàng)建一個(gè)調(diào)度器,并按照我們定義的時(shí)間計(jì)劃來(lái)執(zhí)行任務(wù)

4.2 使用 ThreadPoolTaskScheduler

默認(rèn)情況下,Spring 使用 ThreadPoolTaskScheduler 作為TaskScheduler的實(shí)現(xiàn)類。它內(nèi)部維護(hù)了一個(gè)線程池,用于執(zhí)行定時(shí)任務(wù)。這樣可以確保多個(gè)定時(shí)任務(wù)能夠并發(fā)執(zhí)行,而不會(huì)阻塞主線程。

注意: 如果你的應(yīng)用中有多個(gè)定時(shí)任務(wù),或者某些任務(wù)執(zhí)行時(shí)間較長(zhǎng),建議自定義ThreadPoolTaskScheduler的線程池大小,以避免任務(wù)堆積或資源浪費(fèi)。

4.3 定時(shí)任務(wù)的執(zhí)行流程

1、初始化階段:啟動(dòng) Spring 應(yīng)用時(shí),@EnableScheduling 注解會(huì)觸發(fā) Spring 的配置,掃描所有被 @Scheduled 注解標(biāo)記的方法。
2、注冊(cè)任務(wù):所有符合條件的定時(shí)任務(wù)方法會(huì)被注冊(cè)到 TaskScheduler 中。
3、執(zhí)行任務(wù):根據(jù)配置的時(shí)間計(jì)劃,TaskScheduler 會(huì)調(diào)度并在合適的線程中執(zhí)行相應(yīng)的任務(wù)方法。

5. 延時(shí)執(zhí)行的定時(shí)任務(wù)

為了更好地理解 @Scheduled 的使用,我們來(lái)實(shí)現(xiàn)一個(gè)稍微復(fù)雜些的示例——延時(shí)執(zhí)行任務(wù)。假設(shè)我們有一個(gè)任務(wù)需要在應(yīng)用啟動(dòng)后延時(shí)10秒執(zhí)行一次,然后每隔5秒重復(fù)執(zhí)行。

5.1 創(chuàng)建定時(shí)任務(wù)類

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
publicclass DelayedScheduledTasks {
    privateboolean firstRun = true;
    @Scheduled(fixedRate = 5000, initialDelay = 10000)
    public void delayedTask() {
        if (firstRun) {
            System.out.println("延時(shí)10秒后首次執(zhí)行任務(wù),當(dāng)前時(shí)間:" + System.currentTimeMillis());
            firstRun = false;
        } else {
            System.out.println("每5秒執(zhí)行一次任務(wù),當(dāng)前時(shí)間:" + System.currentTimeMillis());
        }
    }
}

5.2 解釋

fixedRate = 5000: 任務(wù)每5秒執(zhí)行一次。
initialDelay = 10000: 應(yīng)用啟動(dòng)后,延時(shí)10秒首次執(zhí)行任務(wù)。

6.自定義TaskScheduler

有時(shí)候,默認(rèn)的 ThreadPoolTaskScheduler 可能無(wú)法滿足我們的需求,比如需要更高的并發(fā)能力或特定的線程名稱模式。這時(shí)候,我們可以自定義一個(gè) TaskScheduler Bean。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
@Configuration
publicclass SchedulerConfig {
    @Bean
    public ThreadPoolTaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setPoolSize(10); // 設(shè)置線程池大小
        scheduler.setThreadNamePrefix("MyScheduler-"); // 設(shè)置線程名稱前綴
        scheduler.initialize();
        return scheduler;
    }
}

通過(guò)上述配置,我們創(chuàng)建了一個(gè)擁有10個(gè)線程的線程池,并為每個(gè)線程命名,方便日志追蹤和調(diào)試。

到此這篇關(guān)于Spring @Scheduled注解詳解的文章就介紹到這了,更多相關(guān)Spring @Scheduled注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Kotlin 基礎(chǔ)教程之異常

    Kotlin 基礎(chǔ)教程之異常

    這篇文章主要介紹了Kotlin 基礎(chǔ)教程之異常的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • 基于Jenkins搭建.NET FrameWork持續(xù)集成環(huán)境

    基于Jenkins搭建.NET FrameWork持續(xù)集成環(huán)境

    這篇文章主要介紹了基于Jenkins搭建.NET FrameWork持續(xù)集成環(huán)境,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Spring中初始化泛型類的方法實(shí)例

    Spring中初始化泛型類的方法實(shí)例

    這篇文章主要給大家介紹了Spring中如何初始化泛型類,文中給出詳細(xì)的介紹和方法實(shí)例,對(duì)大家的理解和學(xué)習(xí)具有一定的參考借鑒價(jià)值,有需要的朋友可以參考學(xué)習(xí),下面來(lái)一起看看吧。
    2017-01-01
  • SpringBoot基于Redis實(shí)現(xiàn)短信登錄的操作

    SpringBoot基于Redis實(shí)現(xiàn)短信登錄的操作

    驗(yàn)證碼登錄是非常常見(jiàn)的一種登錄方式,能夠簡(jiǎn)化用戶登錄的過(guò)程,本文主要介紹了SpringBoot基于Redis實(shí)現(xiàn)短信登錄的操作,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • Java之SM4加密解密的實(shí)現(xiàn)

    Java之SM4加密解密的實(shí)現(xiàn)

    這篇文章主要介紹了Java之SM4加密解密的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Spring Boot中的那些條件判斷的實(shí)現(xiàn)方法

    Spring Boot中的那些條件判斷的實(shí)現(xiàn)方法

    這篇文章主要介紹了Spring Boot中的那些條件判斷的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Nacos動(dòng)態(tài)配置管理機(jī)制方式

    Nacos動(dòng)態(tài)配置管理機(jī)制方式

    這篇文章主要介紹了Nacos動(dòng)態(tài)配置管理機(jī)制方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • java?Stream流常見(jiàn)操作方法(反射,類加載器,類加載,反射)

    java?Stream流常見(jiàn)操作方法(反射,類加載器,類加載,反射)

    這篇文章主要介紹了java?Stream流常見(jiàn)操作方法(反射,類加載器,類加載,反射),文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定參考價(jià)值,感興趣的小伙伴可以參考一下
    2022-06-06
  • 把Java程序轉(zhuǎn)換成exe,可直接運(yùn)行的實(shí)現(xiàn)

    把Java程序轉(zhuǎn)換成exe,可直接運(yùn)行的實(shí)現(xiàn)

    這篇文章主要介紹了把Java程序轉(zhuǎn)換成exe,可直接運(yùn)行的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • SpringBoot整合Netty實(shí)現(xiàn)WebSocket的示例代碼

    SpringBoot整合Netty實(shí)現(xiàn)WebSocket的示例代碼

    本文主要介紹了SpringBoot整合Netty實(shí)現(xiàn)WebSocket的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05

最新評(píng)論

怀仁县| 蓬溪县| 郑州市| 平顶山市| 乌拉特中旗| 武乡县| 佛坪县| 沈丘县| 德格县| 茶陵县| 泾源县| 淮北市| 平武县| 齐河县| 商洛市| 洞口县| 鄄城县| 平和县| 新巴尔虎右旗| 天峨县| 伊川县| 苍山县| 绍兴市| 成安县| 彝良县| 南岸区| 清涧县| 项城市| 右玉县| 张家界市| 莫力| 嘉义市| 余庆县| 黄冈市| 泰顺县| 诸城市| 宽城| 华池县| 东明县| 宝鸡市| 华阴市|