欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring @Scheduled注解及工作原理

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

1.@Scheduled注解定義

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

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

2.配置 @Scheduled

在開始使用 @Scheduled 之前,我們需要做一些配置工作。首先,確保你的 Spring 項目中引入了 spring-boot-starter,因為它已經(jīng)包含了必要的依賴。

2.1 開啟定時任務(wù)支持

在你的主類(通常標(biāo)注了 @SpringBootApplication 的類)上添加@EnableScheduling注解,以啟用定時任務(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)建定時任務(wù)

接下來,我們創(chuàng)建一個服務(wù)類,并在其中定義一個定時任務(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)前時間:" + System.currentTimeMillis());
    }
}

3. 常用屬性

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

3.1 fixedRate

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

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

3.2 fixedDelay

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

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

3.3 cron

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

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

4.工作原理

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

4.1 基于TaskScheduler

Spring 的定時任務(wù)是基于 TaskScheduler 接口實現(xiàn)的。當(dāng)我們在方法上使用 @Scheduled 注解時,Spring 會自動為其創(chuàng)建一個調(diào)度器,并按照我們定義的時間計劃來執(zhí)行任務(wù)

4.2 使用 ThreadPoolTaskScheduler

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

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

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

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

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

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

5.1 創(chuàng)建定時任務(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("延時10秒后首次執(zhí)行任務(wù),當(dāng)前時間:" + System.currentTimeMillis());
            firstRun = false;
        } else {
            System.out.println("每5秒執(zhí)行一次任務(wù),當(dāng)前時間:" + System.currentTimeMillis());
        }
    }
}

5.2 解釋

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

6.自定義TaskScheduler

有時候,默認的 ThreadPoolTaskScheduler 可能無法滿足我們的需求,比如需要更高的并發(fā)能力或特定的線程名稱模式。這時候,我們可以自定義一個 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;
    }
}

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

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

相關(guān)文章

  • 淺談java中replace()和replaceAll()的區(qū)別

    淺談java中replace()和replaceAll()的區(qū)別

    這篇文章主要介紹了java中replace()和replaceAll()的區(qū)別,兩者都是常用的替換字符的方法,感興趣的小伙伴們可以參考一下
    2015-11-11
  • 全面了解Java中的內(nèi)部類和匿名類

    全面了解Java中的內(nèi)部類和匿名類

    下面小編就為大家?guī)硪黄媪私釰ava中的內(nèi)部類和匿名類。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-07-07
  • 查看vscode中JDK版本的兩個簡單方法小結(jié)

    查看vscode中JDK版本的兩個簡單方法小結(jié)

    這篇文章主要介紹了查看vscode中JDK版本的兩個簡單方法,分別是通過命令面板或資源管理器Explorer來查找和設(shè)置JDK版本,包括具體步驟和操作說明,需要的朋友可以參考下
    2025-05-05
  • 基于SpringCloudAlibaba+Skywalking的全鏈路監(jiān)控設(shè)計方案

    基于SpringCloudAlibaba+Skywalking的全鏈路監(jiān)控設(shè)計方案

    這篇文章主要介紹了基于SpringCloudAlibaba+Skywalking的全鏈路監(jiān)控設(shè)計方案,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-01-01
  • java如何獲取yml配置文件工具類

    java如何獲取yml配置文件工具類

    本文介紹了java獲取yml配置文件的工具類引入pom文件的方法,首先,創(chuàng)建一個與工具類同名的類,然后將工具類的代碼復(fù)制到新創(chuàng)建的類中,運行后輸出:0*/1***?完成操作,此方法簡單易行,適合初學(xué)者使用
    2024-10-10
  • Spring Boot中使用RabbitMQ 生產(chǎn)消息和消費消息的實例代碼

    Spring Boot中使用RabbitMQ 生產(chǎn)消息和消費消息的實例代碼

    本文介紹了在SpringBoot中如何使用RabbitMQ進行消息的生產(chǎn)和消費,詳細闡述了RabbitMQ中交換機的作用和類型,包括直連交換機、主題交換機、扇出交換機和頭交換機,并解釋了各自的消息路由機制,感興趣的朋友一起看看吧
    2024-10-10
  • Tk.mybatis零sql語句實現(xiàn)動態(tài)sql查詢的方法(4種)

    Tk.mybatis零sql語句實現(xiàn)動態(tài)sql查詢的方法(4種)

    有時候,查詢數(shù)據(jù)需要根據(jù)條件使用動態(tài)查詢,這時候需要使用動態(tài)sql,本文主要介紹了Tk.mybatis零sql語句實現(xiàn)動態(tài)sql查詢的方法,感興趣的可以了解一下
    2021-12-12
  • Java行為型模式中命令模式分析

    Java行為型模式中命令模式分析

    在軟件設(shè)計中,我們經(jīng)常需要向某些對象發(fā)送請求,但是并不知道請求的接收者是誰,也不知道被請求的操作是哪個,我們只需在程序運行時指定具體的請求接收者即可,此時可以使用命令模式來進行設(shè)計
    2023-02-02
  • 使用easyexcel導(dǎo)出的excel文件,使用poi讀取時異常處理方案

    使用easyexcel導(dǎo)出的excel文件,使用poi讀取時異常處理方案

    這篇文章主要介紹了使用easyexcel導(dǎo)出的excel文件,使用poi讀取時異常處理方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • java控制臺輸出數(shù)字金字塔示例分享

    java控制臺輸出數(shù)字金字塔示例分享

    這篇文章主要介紹了java控制臺輸出數(shù)字金字塔的示例,控制臺輸出的缺陷是數(shù)字不能完全居中,只能右對齊或左對齊,大家參考使用吧
    2014-01-01

最新評論