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

Spring多線程通過@Scheduled實(shí)現(xiàn)定時(shí)任務(wù)

 更新時(shí)間:2022年05月25日 16:09:10   作者:千云  
這篇文章主要介紹了Spring多線程通過@Scheduled實(shí)現(xiàn)定時(shí)任務(wù),@Scheduled?定時(shí)任務(wù)調(diào)度注解,是spring定時(shí)任務(wù)中最重要的,下文關(guān)于其具體介紹,需要的小伙伴可以參考一下

一、前言

技術(shù)的入門大多比較簡單,把別人的代碼復(fù)制過來,刪刪改改,基本也就能實(shí)現(xiàn)個(gè)功能,查看個(gè)API大概也就知道如何實(shí)現(xiàn)幾個(gè)功能,但是,如果對一項(xiàng)技術(shù)了解的足夠深入,就要知道一個(gè)技術(shù)的優(yōu)缺點(diǎn),以及他存在的問題,這些就需要大量的時(shí)間及思考,疾風(fēng)知?jiǎng)挪?,只有足夠了解才能臨危不懼,才能在如疾風(fēng)般強(qiáng)勁的bug來臨時(shí)微微一笑,絕對不倒!

二、定時(shí)任務(wù)調(diào)度注解@Scheduled

這個(gè)注解是spring定時(shí)任務(wù)中的主角,他包含幾種類型:

  • @Scheduled(fixedDelay = 2000) 
  • @Scheduled(fixedRate = 2000) 
  • @Scheduled(initialDelay = 1000, fixedDelay = 2000)   
  • @Scheduled(cron = "*/5 * * * * *")

使用過定時(shí)任務(wù)的童鞋應(yīng)該都是使用過以上集中注解,現(xiàn)在簡單介紹一下

  •  @Scheduled(fixedDelay = 2000)   等上一個(gè)任務(wù)執(zhí)行完2s后執(zhí)行
  •  @Scheduled(fixedRate = 2000)    從上一個(gè)任務(wù)開始后的2s,下一個(gè)任務(wù)進(jìn)行執(zhí)行
  •  @Scheduled(initialDelay = 1000, fixedDelay = 2000)  方法不會(huì)立即執(zhí)行 要等initialDelay后再執(zhí)行
  •  @Scheduled(cron = "*/5 * * * * *")   選定時(shí)間進(jìn)行執(zhí)行

下面重點(diǎn)說一下 @Scheduled(fixedRate = 2000) 他的說明是從上一個(gè)任務(wù)開始后的2s,下一個(gè)任務(wù)進(jìn)行執(zhí)行,但是真的如此嗎? 我們來驗(yàn)證一下

創(chuàng)建一個(gè)定時(shí)任務(wù)類,及定時(shí)任務(wù)方法:

/**
 * Spring的定時(shí)任務(wù)
 */
@Component
@EnableScheduling
public class ScheduleJob {
    @Autowired
    private TaskService taskService;
    /**
     * 和上一個(gè)方法的開始和下一個(gè)方法的開始固定是2s
     * 這種方法適合任務(wù)之間是獨(dú)立的
     */
    @Scheduled(fixedRate = 2000)
    public void fixedRateTaskR() {
        taskService.sayHello("fixedRate");
    }

創(chuàng)建接口:

public interface TaskService {
    void sayHello(String type);
}

具體實(shí)現(xiàn)類:

    @Override
    public void sayHello(String type) {
        try {
            long startTime = System.currentTimeMillis() / 1000;
            System.out.println(type + " => " + startTime + " - 任務(wù)開始");

            System.out.println(type + " => " + "任務(wù)執(zhí)行中");
            Thread.sleep(5000);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

我在執(zhí)行的任務(wù)線程進(jìn)行延時(shí)操作,每次執(zhí)行都會(huì)休眠5s,如果每兩秒執(zhí)行一次那么,方法的間隔時(shí)間打印出來就是2s,我們執(zhí)行下,

看下結(jié)果:

fixedRate => 1632646194 - 任務(wù)開始
fixedRate => 任務(wù)執(zhí)行中
fixedRate => 1632646197 - 任務(wù)開始
fixedRate => 任務(wù)執(zhí)行中
fixedRate => 1632646199 - 任務(wù)開始

結(jié)果很明顯是間隔了5s執(zhí)行一次,而不是2s,說明要等上一個(gè)任務(wù)執(zhí)行完下一個(gè)任務(wù)才會(huì)執(zhí)行,哇塞不哇塞! 既然存在這樣的問題,那如果我就要不等上一個(gè)任務(wù)執(zhí)行完,就是要2s執(zhí)行一次能不能干! 當(dāng)然能干!現(xiàn)在就干!

三、使用@Async實(shí)現(xiàn)異步調(diào)度

建立spring線程池

/**
 * @Description spring線程池配置類
 */
@EnableAsync
@Configuration
public class SendMsgThreadPoolConfig {
    @Bean("schedule")
    public Executor schduleTaskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(2);
        executor.setMaxPoolSize(2);
        executor.setQueueCapacity(100);
        executor.setKeepAliveSeconds(60);
        executor.setThreadNamePrefix("schedule-");
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        return executor;
    }
}

為異步調(diào)度方法指定線程池

   @Override
    @Async("schedule")
    public void sayHello(String type) {
        try {
            long startTime = System.currentTimeMillis() / 1000;
            System.out.println(type + " => " + startTime + " - 任務(wù)開始");
            System.out.println(type + " => " + "任務(wù)執(zhí)行中");
            Thread.sleep(5000);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

我們再執(zhí)行以下,看下輸出結(jié)果:

fixedRate => 任務(wù)執(zhí)行中
fixedRate => 1632646666 - 任務(wù)開始
fixedRate => 任務(wù)執(zhí)行中
fixedRate => 1632646668 - 任務(wù)開始
fixedRate => 任務(wù)執(zhí)行中
fixedRate => 1632646671 - 任務(wù)開始
fixedRate => 任務(wù)執(zhí)行中
fixedRate => 1632646673 - 任務(wù)開始

看下控制臺(tái),現(xiàn)在的時(shí)間間隔就是2s,2s,3s,小伙伴可能就會(huì)覺得奇怪了,為啥出現(xiàn)了3s的間隔,這是咋回事,這是因?yàn)槲覀儎?chuàng)建的線程池,我們線程池的核心線程和最大線程數(shù)都是2個(gè),每兩秒執(zhí)行一次,前4s兩個(gè)線程就被占滿了,第三個(gè)任務(wù)執(zhí)行時(shí),要進(jìn)行等待,因?yàn)榈谝粋€(gè)任務(wù)線程的休眠時(shí)間是5s,那么第三個(gè)任務(wù)線程在等待1s后會(huì)執(zhí)行,這就是間隔3s的原因,驗(yàn)證一下,將線程數(shù)修改為3個(gè)。

看下控制臺(tái)輸出:

fixedRate => 1632647147 - 任務(wù)開始
fixedRate => 任務(wù)執(zhí)行中
fixedRate => 1632647149 - 任務(wù)開始
fixedRate => 任務(wù)執(zhí)行中
fixedRate => 1632647151 - 任務(wù)開始
fixedRate => 任務(wù)執(zhí)行中

這是執(zhí)行時(shí)間間隔就為2s了。

到此這篇關(guān)于Spring多線程通過@Scheduled實(shí)現(xiàn)定時(shí)任務(wù)的文章就介紹到這了,更多相關(guān)Spring定時(shí)任務(wù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java開發(fā)中如何使用JVisualVM進(jìn)行性能分析

    java開發(fā)中如何使用JVisualVM進(jìn)行性能分析

    JVisualVM是由Sun提供的性能分析工具,如此強(qiáng)大的后盾怎能不強(qiáng)大?在Jdk6.0以后的版本中是自帶的,配置好環(huán)境變量然后在運(yùn)行中輸入“JVisualVm”或直接到Jdk的安裝目錄的Bin目錄下找到運(yùn)行程序即可運(yùn)行。如果是用Jdk1.5或以前版本的朋友就得要單獨(dú)安裝了
    2015-12-12
  • Java設(shè)計(jì)模式之淺談模板方法模式

    Java設(shè)計(jì)模式之淺談模板方法模式

    今天給大家?guī)淼氖顷P(guān)于Java設(shè)計(jì)模式的相關(guān)知識(shí),文章圍繞著Java模板方法展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • JAVA實(shí)現(xiàn)異步調(diào)用實(shí)例代碼

    JAVA實(shí)現(xiàn)異步調(diào)用實(shí)例代碼

    在java平臺(tái),實(shí)現(xiàn)異步調(diào)用的角色主要三種角色:調(diào)用者、取貨憑證、真實(shí)數(shù)據(jù)。本篇文章給大家介紹java實(shí)現(xiàn)異步調(diào)用實(shí)例代碼,需要的朋友可以參考下
    2015-09-09
  • Java后端產(chǎn)生驗(yàn)證碼后臺(tái)驗(yàn)證功能的實(shí)現(xiàn)代碼

    Java后端產(chǎn)生驗(yàn)證碼后臺(tái)驗(yàn)證功能的實(shí)現(xiàn)代碼

    這篇文章主要介紹了Java后臺(tái)產(chǎn)生驗(yàn)證碼后臺(tái)驗(yàn)證功能,本文文字結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-06-06
  • spring+srpingmvc+hibernate實(shí)現(xiàn)動(dòng)態(tài)ztree生成樹狀圖效果

    spring+srpingmvc+hibernate實(shí)現(xiàn)動(dòng)態(tài)ztree生成樹狀圖效果

    這篇文章主要介紹了spring+srpingmvc+hibernate動(dòng)態(tài)ztree生成樹狀圖效果,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Spring MVC的文件上傳和下載以及攔截器的使用實(shí)例

    Spring MVC的文件上傳和下載以及攔截器的使用實(shí)例

    這篇文章主要介紹了Spring MVC的文件上傳和下載以及攔截器的使用實(shí)例,具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-08-08
  • Java的常用包

    Java的常用包

    本文主要對Java的常用包進(jìn)行一一介紹。具有一定的參考價(jià)值,下面跟著小編一起來看下吧
    2017-01-01
  • Java中使用Preconditions來檢查傳入?yún)?shù)介紹

    Java中使用Preconditions來檢查傳入?yún)?shù)介紹

    這篇文章主要介紹了Java中使用Preconditions來檢查傳入?yún)?shù)介紹,本文只是作為一個(gè)簡單的用法介紹,需要的朋友可以參考下
    2015-06-06
  • 并發(fā)編程之Java內(nèi)存模型順序一致性

    并發(fā)編程之Java內(nèi)存模型順序一致性

    這篇文章主要介紹了并發(fā)編程Java內(nèi)存模型順序一致性,順序一致性內(nèi)存模型是一個(gè)理論參考模型,處理器的內(nèi)存模型和編程語言的內(nèi)存模型都會(huì)以順序一致性內(nèi)存模型作為參照,下面我們一起進(jìn)入文章看看學(xué)校內(nèi)容,需要的朋友可以參考一下
    2021-11-11
  • springboot 實(shí)現(xiàn)長鏈接轉(zhuǎn)短鏈接的示例代碼

    springboot 實(shí)現(xiàn)長鏈接轉(zhuǎn)短鏈接的示例代碼

    短鏈接服務(wù)通過將長URL轉(zhuǎn)換成6位短碼,并存儲(chǔ)長短鏈接對應(yīng)關(guān)系到數(shù)據(jù)庫中,用戶訪問短鏈接時(shí),系統(tǒng)通過查詢數(shù)據(jù)庫并重定向到原始URL,實(shí)現(xiàn)快速訪問,本文就來介紹一下如何使用,感興趣的可以了解一下
    2024-09-09

最新評論

凤冈县| 综艺| 柘荣县| 西林县| 阿克苏市| 宁国市| 新绛县| 金寨县| 灵川县| 原平市| 义乌市| 东乡| 汉川市| 宜宾县| 延长县| 神木县| 博客| 关岭| 齐齐哈尔市| 镇坪县| 台江县| 柏乡县| 长沙县| 和静县| 白山市| 泉州市| 婺源县| 蓬安县| 昌吉市| 淄博市| 枣阳市| 富阳市| 开化县| 三江| 远安县| 萝北县| 永兴县| 肇源县| 涟水县| 家居| 横峰县|