亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Spring兩種任務(wù)調(diào)度Scheduled和Async的區(qū)別和應(yīng)用場(chǎng)景詳解

 更新時(shí)間:2024年12月09日 09:43:23   作者:牛肉胡辣湯  
在現(xiàn)代應(yīng)用程序中,任務(wù)調(diào)度是一個(gè)非常普遍的需求,Spring框架提供了兩種主要的方式來(lái)實(shí)現(xiàn)任務(wù)調(diào)度:??Scheduled?? 和 ??Async??,在這篇文章中,我們將詳細(xì)介紹這兩種方式的區(qū)別和應(yīng)用場(chǎng)景,需要的朋友可以參考下

Spring任務(wù)調(diào)度簡(jiǎn)介

在現(xiàn)代應(yīng)用程序中,任務(wù)調(diào)度是一個(gè)非常普遍的需求。Spring框架提供了兩種主要的方式來(lái)實(shí)現(xiàn)任務(wù)調(diào)度:??Scheduled?? 和 ??Async??。在這篇文章中,我們將詳細(xì)介紹這兩種方式的區(qū)別和應(yīng)用場(chǎng)景。

Scheduled任務(wù)

??Scheduled?? 任務(wù)是Spring提供的基于??@Scheduled??注解的任務(wù)調(diào)度方式。使用這種方式,你可以輕松地在一個(gè)方法上設(shè)置定時(shí)器,讓方法按照指定的頻率執(zhí)行。以下是使用??@Scheduled??注解的一個(gè)簡(jiǎn)單例子:

@Component
public class ScheduledTask {
 
    @Scheduled(cron = "0 * * * * ?") // 每分鐘執(zhí)行
    public void scheduledTask() {
        System.out.println("Scheduled task executed!");
    }
}

在這個(gè)例子中,??@Scheduled??注解的??cron??屬性設(shè)置了一個(gè)簡(jiǎn)單的Cron表達(dá)式,表示每分鐘執(zhí)行一次任務(wù)。

Scheduled任務(wù)的特點(diǎn)

  • 定時(shí)性:??Scheduled?? 任務(wù)可以根據(jù)Cron表達(dá)式或者固定延時(shí)來(lái)精確地調(diào)度任務(wù)執(zhí)行時(shí)間。
  • 執(zhí)行順序:??Scheduled?? 任務(wù)會(huì)按照設(shè)定的順序執(zhí)行,這對(duì)于需要嚴(yán)格控制執(zhí)行順序的任務(wù)非常有用。
  • 重復(fù)執(zhí)行:??Scheduled?? 任務(wù)可以設(shè)置重復(fù)執(zhí)行的頻率,比如每小時(shí)、每天、每周等。

Async任務(wù)

??Async?? 任務(wù)是Spring提供的異步執(zhí)行任務(wù)的方式。使用這種方式,你可以將一個(gè)方法標(biāo)記為異步執(zhí)行,Spring會(huì)自動(dòng)將其提交給線程池進(jìn)行處理。以下是使用??@Async??注解的一個(gè)簡(jiǎn)單例子:

@Component
public class AsyncTask {
 
    @Async
    public void asyncTask() {
        System.out.println("Async task executed!");
    }
}

Async任務(wù)的特點(diǎn)

  • 非阻塞:??Async?? 任務(wù)會(huì)在調(diào)用后立即返回,不會(huì)阻塞當(dāng)前線程。
  • 并發(fā)執(zhí)行:??Async?? 任務(wù)可以在多個(gè)線程中并發(fā)執(zhí)行,提高應(yīng)用程序的吞吐量。
  • 不保證順序:??Async?? 任務(wù)不保證執(zhí)行的順序,因?yàn)樗鼈冊(cè)诓煌木€程中執(zhí)行。

比較與選擇

在選擇使用??Scheduled??還是??Async??時(shí),你應(yīng)該考慮以下因素:

  • 任務(wù)性質(zhì):如果任務(wù)是計(jì)算密集型的或者需要嚴(yán)格控制執(zhí)行順序,那么??Scheduled??可能更合適。如果是I/O密集型或者對(duì)執(zhí)行順序沒(méi)有嚴(yán)格要求,??Async??可能更好。
  • 系統(tǒng)性能:如果系統(tǒng)需要處理大量并發(fā)任務(wù),??Async??可以提高性能,因?yàn)樗梢栽诰€程池中并發(fā)執(zhí)行任務(wù)。
  • 定時(shí)需求:如果任務(wù)需要定時(shí)執(zhí)行,那么??Scheduled??是更好的選擇。

總結(jié)來(lái)說(shuō),??Scheduled??適合需要定時(shí)執(zhí)行且對(duì)執(zhí)行順序有要求的情況,而??Async??適合需要異步執(zhí)行且對(duì)執(zhí)行順序沒(méi)有要求的情況。在實(shí)際應(yīng)用中,根據(jù)具體需求選擇合適的方式可以提高應(yīng)用程序的效率和性能。在實(shí)際應(yīng)用中,Spring的??Scheduled??和??Async??注解常用于異步任務(wù)的處理。下面分別給出一個(gè)簡(jiǎn)單的示例代碼,演示如何在Spring中使用這兩個(gè)注解。

Scheduled 示例

??Scheduled??注解用于定期執(zhí)行任務(wù)。以下是一個(gè)簡(jiǎn)單的定時(shí)任務(wù)示例,它會(huì)每隔5秒鐘打印一次消息:

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
 
import java.util.Date;
 
@Component
public class ScheduledTask {
 
    @Scheduled(fixedRate = 5000) // 每隔5秒執(zhí)行
    public void scheduledTask() {
        System.out.println("Scheduled task executed at: " + new Date());
    }
 
}

在這個(gè)例子中,??@Scheduled??注解被放在方法??scheduledTask()??上,這表示該方法將按照指定的頻率執(zhí)行。??fixedRate??屬性指定了任務(wù)執(zhí)行的頻率,單位是毫秒。

Async 示例

??Async??注解用于將方法聲明為異步執(zhí)行。以下是一個(gè)簡(jiǎn)單的異步任務(wù)示例:

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
 
import java.util.concurrent.Future;
 
@Component
public class AsyncTask {
 
    @Async
    public Future<String> asyncTask() {
        System.out.println("Async task started...");
        // 模擬長(zhǎng)時(shí)間運(yùn)行的任務(wù)
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Async task completed.");
        return Future.<String>supplyAsync(() -> "Task completed!").get(); // 返回一個(gè)Future對(duì)象
    }
 
}

在這個(gè)例子中,??@Async??注解被放在方法??asyncTask()??上,這表示該方法將以異步方式執(zhí)行。方法返回一個(gè)??Future??對(duì)象,它允許在任務(wù)完成時(shí)獲取結(jié)果。

請(qǐng)注意,使用??@Async??注解的方法必須在一個(gè)支持異步執(zhí)行的環(huán)境中運(yùn)行,例如Spring的??@EnableAsync??注解會(huì)啟用異步支持。通常,你需要在Spring配置類中添加以下配置:

import org.springframework.scheduling.annotation.EnableAsync;
 
@Configuration
@EnableAsync
public class AppConfig {
 
}

這將啟用異步支持,使得??@Async??注解能夠正常工作。

在實(shí)際應(yīng)用中,你可能還會(huì)結(jié)合使用??@Scheduled??和??@Async??注解,例如,你可能有一個(gè)需要在特定時(shí)間異步執(zhí)行的任務(wù)。Spring框架提供了兩種任務(wù)調(diào)度的方法:??Scheduled??和??Async??。這兩種方法都可以通過(guò)??@Scheduled??和??@Async??注解來(lái)實(shí)現(xiàn)。下面我將詳細(xì)介紹這兩種方法的用法和代碼示例。

Scheduled

??@Scheduled??注解用于創(chuàng)建定期執(zhí)行的任務(wù)。它支持多種觸發(fā)器,包括固定速率、固定延遲和 cron 表達(dá)式。下面是一個(gè)使用 ??@Scheduled?? 注解的簡(jiǎn)單示例:

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
 
@Component
public class ScheduledTask {
 
    @Scheduled(fixedRate = 1000 * 60 * 10) // 每10分鐘執(zhí)行一次
    public void scheduledTask() {
        System.out.println("Scheduled task executed!");
    }
 
    @Scheduled(cron = "0 0 12 * * ?") // 在每天中午12點(diǎn)執(zhí)行
    public void cronTask() {
        System.out.println("Cron task executed!");
    }
 
    // 其他方法...
}

在這個(gè)例子中,??@Scheduled?? 注解被應(yīng)用到兩個(gè)方法上。第一個(gè)方法使用 ??fixedRate?? 屬性來(lái)設(shè)置任務(wù)每10分鐘執(zhí)行一次。第二個(gè)方法使用 ??cron?? 屬性來(lái)設(shè)置一個(gè)cron表達(dá)式,這個(gè)表達(dá)式表示在每天中午12點(diǎn)執(zhí)行任務(wù)。

Async

??@Async?? 注解用于異步執(zhí)行方法。當(dāng)一個(gè)方法被標(biāo)記為 ??@Async?? 時(shí),Spring 會(huì)使用 ??AsyncTaskExecutor?? 來(lái)執(zhí)行該方法,而不會(huì)阻塞調(diào)用線程。下面是一個(gè)使用 ??@Async?? 注解的簡(jiǎn)單示例:

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
 
@Component
public class AsyncTask {
 
    @Async
    public void asyncTask() {
        System.out.println("Async task executed in a separate thread!");
    }
 
    // 其他方法...
}

在這個(gè)例子中,??@Async?? 注解被應(yīng)用到一個(gè)方法上。當(dāng)這個(gè)方法被調(diào)用時(shí),它將在一個(gè)單獨(dú)的線程中執(zhí)行,而不會(huì)阻塞調(diào)用線程。

結(jié)合使用

你也可以將 ??@Scheduled?? 和 ??@Async?? 注解結(jié)合起來(lái)使用,這樣你可以定期執(zhí)行一個(gè)異步任務(wù)。下面是一個(gè)結(jié)合使用的示例:

import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
 
@Component
public class ScheduledAndAsyncTask {
 
    @Scheduled(fixedRate = 1000 * 60 * 10)
    @Async
    public void scheduledAndAsyncTask() {
        System.out.println("Scheduled and async task executed in a separate thread!");
    }
 
    // 其他方法...
}

在這個(gè)例子中,??@Scheduled?? 和 ??@Async?? 注解被同時(shí)應(yīng)用到一個(gè)方法上。這意味著這個(gè)任務(wù)將定期執(zhí)行,并且是在一個(gè)單獨(dú)的線程中異步執(zhí)行的。

請(qǐng)注意,當(dāng)使用 ??@Async?? 注解時(shí),你可能需要確保你的應(yīng)用程序上下文中有 ??AsyncTaskExecutor?? 或者 ??TaskExecutor?? 來(lái)執(zhí)行這些異步任務(wù)。通常,你可以通過(guò)配置 ??@EnableAsync?? 注解來(lái)啟用異步支持,并提供一個(gè) ??TaskExecutor?? bean。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 
@Configuration
@EnableAsync
public class AsyncConfiguration {
 
    @Bean(name = "taskExecutor")
    public ThreadPoolTaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        // 配置線程池參數(shù)...
        return executor;
    }
 
    // 其他 bean 定義...
}

在這個(gè)配置類中,我們創(chuàng)建了一個(gè) ??ThreadPoolTaskExecutor?? 并將其作為 ??taskExecutor?? bean 注冊(cè)到 Spring 應(yīng)用程序上下文中。這樣,任何被 ??@Async?? 注解的方法都將在這個(gè)線程

以上就是Spring兩種任務(wù)調(diào)度Scheduled和Async的區(qū)別和應(yīng)用場(chǎng)景詳解的詳細(xì)內(nèi)容,更多關(guān)于Spring任務(wù)調(diào)度Scheduled和Async的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Spring中PathMatcher路徑匹配器的實(shí)現(xiàn)

    Spring中PathMatcher路徑匹配器的實(shí)現(xiàn)

    Spring框架中的PathMatcher是一個(gè)接口,本文主要介紹了Spring中PathMatcher路徑匹配器的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07
  • java隨機(jī)生成8位數(shù)授權(quán)碼的實(shí)例

    java隨機(jī)生成8位數(shù)授權(quán)碼的實(shí)例

    下面小編就為大家?guī)?lái)一篇java隨機(jī)生成8位數(shù)授權(quán)碼的實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-02-02
  • 使用Spring?Cloud?Stream處理事件的示例詳解

    使用Spring?Cloud?Stream處理事件的示例詳解

    Spring?Cloud?Stream?是基于?Spring?Boot?的用于構(gòu)建消息驅(qū)動(dòng)微服務(wù)的框架,本文主要介紹了如何使用?Spring?Cloud?Stream?來(lái)處理事件,需要的可以參考一下
    2023-06-06
  • Java實(shí)現(xiàn)的Base64加密算法示例

    Java實(shí)現(xiàn)的Base64加密算法示例

    這篇文章主要介紹了Java實(shí)現(xiàn)的Base64加密算法,結(jié)合實(shí)例形式分析了Java實(shí)現(xiàn)的base64編碼轉(zhuǎn)換相關(guān)使用方法及操作注意事項(xiàng),需要的朋友可以參考下
    2018-04-04
  • Java中byte、byte數(shù)組與int、long的轉(zhuǎn)換詳解

    Java中byte、byte數(shù)組與int、long的轉(zhuǎn)換詳解

    這篇文章分別給大家介紹了Java中byte和int之間的轉(zhuǎn)換、Java中 byte數(shù)組和int之間的轉(zhuǎn)換、Java中byte數(shù)組和long之間的轉(zhuǎn)換以及整理了整體工具類的源碼,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-02-02
  • Java實(shí)現(xiàn)Excel導(dǎo)入導(dǎo)出的步驟詳解

    Java實(shí)現(xiàn)Excel導(dǎo)入導(dǎo)出的步驟詳解

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)Excel的導(dǎo)入、導(dǎo)出,文中示例代碼介紹的非常詳細(xì),對(duì)我們的學(xué)習(xí)或工作有一定的幫助,感興趣的小伙伴們可以參考一下
    2023-06-06
  • Java中的JVM虛擬機(jī)內(nèi)存分配詳解

    Java中的JVM虛擬機(jī)內(nèi)存分配詳解

    這篇文章主要介紹了Java中的JVM虛擬機(jī)內(nèi)存分配詳解,虛擬機(jī)是一種能夠執(zhí)行 Java 字節(jié)碼的虛擬機(jī),它是 Java 語(yǔ)言的核心組成部分,負(fù)責(zé)將 Java 代碼轉(zhuǎn)換為機(jī)器碼并執(zhí)行,JVM 提供了內(nèi)存管理、垃圾回收、線程管理等功能,需要的朋友可以參考下
    2023-10-10
  • 詳解Struts2攔截器機(jī)制

    詳解Struts2攔截器機(jī)制

    這篇文章主要介紹了詳解Struts2攔截器機(jī)制,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • Java利用遺傳算法求解最短路徑問(wèn)題

    Java利用遺傳算法求解最短路徑問(wèn)題

    遺傳算法(Genetic Algorithm,GA)最早是由美國(guó)的John holland于20世紀(jì)70年代提出,該算法是根據(jù)大自然中生物體進(jìn)化規(guī)律而設(shè)計(jì)提出的。本文將利用遺傳算法求解最短路徑問(wèn)題,需要的可以參考一下
    2022-06-06
  • 深入淺析SSH的三個(gè)組件ssh、sftp、scp

    深入淺析SSH的三個(gè)組件ssh、sftp、scp

    SSH 包含3個(gè)組件,文中給大家詳細(xì)提到。這篇文章主要介紹了SSH的三個(gè)組件ssh、sftp、scp ,需要的朋友可以參考下
    2018-10-10

最新評(píng)論