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

Java單機(jī)環(huán)境實(shí)現(xiàn)定時(shí)任務(wù)技術(shù)

 更新時(shí)間:2022年04月21日 08:40:12   作者:劍圣無(wú)痕?  
這篇文章主要介紹了Java單機(jī)環(huán)境實(shí)現(xiàn)定時(shí)任務(wù)技術(shù),文章內(nèi)容介紹詳細(xì),具有一定的參考價(jià)值,需要的小伙伴可以參考一下

前言

開(kāi)發(fā)的系統(tǒng)中過(guò)程,會(huì)有如下的需求:

  • 凌晨生成訂單統(tǒng)計(jì)報(bào)表
  • 定時(shí)推送文章、發(fā)送郵件
  • 每隔5分鐘動(dòng)態(tài)抓取數(shù)據(jù)更新
  • 每晚定時(shí)計(jì)算用戶當(dāng)日收益情況并推送給用戶
  • .....

通常這些需求我們都是通過(guò)定時(shí)任務(wù)來(lái)實(shí)現(xiàn),列舉了java中一些常用的的定時(shí)任務(wù)框架。

定時(shí)任務(wù)框架

圖片.png

TimeTask

從我們開(kāi)始學(xué)習(xí)java開(kāi)始,最先實(shí)現(xiàn)定時(shí)任務(wù)的時(shí)候都是采用TimeTask, Timer內(nèi)部使用TaskQueue的類(lèi)存放定時(shí)任務(wù),它是一個(gè)基于最小堆實(shí)現(xiàn)的優(yōu)先級(jí)隊(duì)列。TaskQueue會(huì)按照任務(wù)距離下一次執(zhí)行時(shí)間的大小將任務(wù)排序,保證在堆頂?shù)娜蝿?wù)最先執(zhí)行。

實(shí)例代碼:

 public static void main(String[] args)
    {
          TimerTask task = new TimerTask() {
              public void run() {
                  System.out.println("當(dāng)前時(shí)間: " + new Date() + "n" +
                          "線程名稱: " + Thread.currentThread().getName());
              }
          };
          Timer timer = new Timer("Timer");
          long delay = 5000L;
          timer.schedule(task, delay);
          System.out.println("當(dāng)前時(shí)間: " + new Date() + "n" +
                  "線程名稱: " + Thread.currentThread().getName());
    }

運(yùn)行結(jié)果:

當(dāng)前時(shí)間: Wed Apr 06 22:05:04 CST 2022n線程名稱: main
當(dāng)前時(shí)間: Wed Apr 06 22:05:09 CST 2022n線程名稱: Timer
復(fù)制代碼

從結(jié)果可以看出,5秒后執(zhí)行了定時(shí)任務(wù)。

缺點(diǎn):

  • TimeTask執(zhí)行任務(wù)只能串行執(zhí)行,一旦一個(gè)任務(wù)執(zhí)行的時(shí)間比較長(zhǎng)的話將會(huì)影響其他任務(wù)執(zhí)行
  • 執(zhí)行任務(wù)過(guò)程如果發(fā)生異常,任務(wù)會(huì)直接停止。

隨著時(shí)間的推移,java的技術(shù)也在不斷的更新,針對(duì)TimeTask的不足,ScheduledExecutorService出現(xiàn)替代了TimeTask。

ScheduledExecutorService

ScheduledExecutorService是一個(gè)接口,有多個(gè)實(shí)現(xiàn)類(lèi),比較常用的是ScheduledThreadPoolExecutor。而ScheduledThreadPoolExecutor本身就是一個(gè)線程池,其內(nèi)部使用 DelayQueue 作為任務(wù)隊(duì)列,并且支持任務(wù)并發(fā)執(zhí)行。

實(shí)例代碼:

 public static void main(String[] args) throws InterruptedException
   {
      ScheduledExecutorService executorService =
              Executors.newScheduledThreadPool(3);
      // 執(zhí)行任務(wù): 每 10秒執(zhí)行一次
      executorService.scheduleAtFixedRate(() -> {
          System.out.println("執(zhí)行任務(wù):" + new Date()+",線程名稱: " + Thread.currentThread().getName());
      }, 1, 10, TimeUnit.SECONDS);
    }

缺點(diǎn):

  • 盡量避免用Executors方式去創(chuàng)建線程池,因?yàn)閖dk自帶線程池內(nèi)部使用的的隊(duì)列的比較大,很容易出現(xiàn)OOM。
  • 定時(shí)任務(wù)是基于JVM單機(jī)內(nèi)存形式的,一旦重啟定時(shí)任務(wù)就消失了。
  • 無(wú)法支持cron表達(dá)式實(shí)現(xiàn)豐富的定時(shí)任務(wù)。

Spring Task

學(xué)習(xí)了Spring之后,開(kāi)始使用了Spring 自帶的Task。Spring Framework 自帶定時(shí)任務(wù),提供了 cron 表達(dá)式來(lái)實(shí)現(xiàn)豐富定時(shí)任務(wù)配置。

實(shí)例代碼:

@EnableScheduling
@Component
public class SpringTask
{
    private Logger logger = LoggerFactory.getLogger(SpringTask.class);
    private static final SimpleDateFormat dateFormat = new SimpleDateFormat(
            "HH:mm:ss");
    /**
     * fixedRate:固定速率執(zhí)行。每5秒執(zhí)行一次。
     */
    @Scheduled(fixedRate = 5000)
    public void invokeTaskWithFixedRate()
    {
        logger.info("Fixed Rate Task :  Current Time  is  {}",
                dateFormat.format(new Date()));
    }
    /**
     * fixedDelay:固定延遲執(zhí)行。距離上一次調(diào)用成功后2秒才執(zhí)。
     */
    @Scheduled(fixedDelay = 2000)
    public void invokeTaskWithFixedDelay()
    {
        try
        {
            TimeUnit.SECONDS.sleep(3);
            logger.info("Fixed Delay Task : Current Time  is  {}",
                    dateFormat.format(new Date()));
        }
        catch (InterruptedException e)
        {
            logger.error("invoke task error",e);
        }
    }
    /**
     * initialDelay:初始延遲。任務(wù)的第一次執(zhí)行將延遲5秒,然后將以5秒的固定間隔執(zhí)行。
     */
    @Scheduled(initialDelay = 5000, fixedRate = 5000)
    public void invokeTaskWithInitialDelay()
    {
        logger.info("Task with Initial Delay : Current Time is  {}",
                dateFormat.format(new Date()));
    }
    /**
     * cron:使用Cron表達(dá)式,每隔5秒執(zhí)行一次
     */
    @Scheduled(cron = "0/5 * * * * ? ")
    public void invokeTaskWithCronExpression()
    {
        logger.info("Task Cron Expression:  Current Time  is  {}",
                dateFormat.format(new Date()));
    }
}

執(zhí)行結(jié)果:

2022-04-06 23:06:20.945  INFO 14604 --- [   scheduling-1] com.fw.task.SpringTask                   : Task Cron Expression:  Current Time  is  23:06:20
2022-04-06 23:06:22.557  INFO 14604 --- [   scheduling-1] com.fw.task.SpringTask                   : Task with Initial Delay : Current Time is  23:06:22
2022-04-06 23:06:22.557  INFO 14604 --- [   scheduling-1] com.fw.task.SpringTask                   : Fixed Rate Task :  Current Time  is  23:06:22
2022-04-06 23:06:25.955  INFO 14604 --- [   scheduling-1] com.fw.task.SpringTask                   : Fixed Delay Task : Current Time  is  23:06:25
2022-04-06 23:06:25.955  INFO 14604 --- [   scheduling-1] com.fw.task.SpringTask                   : Task Cron Expression:  Current Time  is  23:06:25
2022-04-06 23:06:27.555  INFO 14604 --- [   scheduling-1] com.fw.task.SpringTask                   : Task with Initial Delay : Current Time is  23:06:27
2022-04-06 23:06:27.556  INFO 14604 --- [   scheduling-1] com.fw.task.SpringTask                   : Fixed Rate Task :  Current Time  is  23:06:27

@EnableScheduling需要開(kāi)啟定時(shí)任務(wù),@Scheduled(cron = "0/5 * * * * ?")配置定時(shí)任務(wù)的規(guī)則。cron表達(dá)式支持豐富定時(shí)任務(wù)配置,不熟悉的的可以查看

優(yōu)點(diǎn):

使用簡(jiǎn)單方便,支持各種復(fù)雜的定時(shí)任務(wù)配置

缺點(diǎn):

  • 基于單機(jī)形式定時(shí)任務(wù),一旦重啟定時(shí)任務(wù)就消失了。
  • 定時(shí)任務(wù)默認(rèn)是單線程執(zhí)行任務(wù),如果需要并行執(zhí)行需要開(kāi)啟@EnableAsync。
  • 沒(méi)有統(tǒng)一的圖形化任務(wù)調(diào)度的管理,無(wú)法控制定時(shí)任務(wù)

結(jié)語(yǔ)

任何技術(shù)的出現(xiàn)都有它的價(jià)值,技術(shù)沒(méi)有最好的,只有最合適的。我們要針對(duì)不同的需求選擇最合適的技術(shù),切莫過(guò)度架構(gòu)設(shè)計(jì)。本文講解了單機(jī)環(huán)境實(shí)現(xiàn)定時(shí)任務(wù)的技術(shù),

到此這篇關(guān)于Java單機(jī)環(huán)境實(shí)現(xiàn)定時(shí)任務(wù)技術(shù)的文章就介紹到這了,更多相關(guān)Java定時(shí)任務(wù)框架內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解決springboot報(bào)錯(cuò)Failed?to?parse?multipart?servlet?request;?nested?exception?is?java.io.IOException問(wèn)題

    解決springboot報(bào)錯(cuò)Failed?to?parse?multipart?servlet?request

    在使用SpringBoot開(kāi)發(fā)時(shí),通過(guò)Postman發(fā)送POST請(qǐng)求,可能會(huì)遇到因臨時(shí)目錄不存在而導(dǎo)致的MultipartException異常,這通常是因?yàn)镺S系統(tǒng)(如CentOS)定期刪除/tmp目錄下的臨時(shí)文件,解決方案包括重啟項(xiàng)目
    2024-10-10
  • java將一個(gè)整數(shù)轉(zhuǎn)化成二進(jìn)制代碼示例

    java將一個(gè)整數(shù)轉(zhuǎn)化成二進(jìn)制代碼示例

    這篇文章主要介紹了java將一個(gè)整數(shù)轉(zhuǎn)化成二進(jìn)制代碼示例,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2017-12-12
  • 如何解決Gradle、Maven項(xiàng)目build后沒(méi)有mybatis的mapper.xml文件的問(wèn)題

    如何解決Gradle、Maven項(xiàng)目build后沒(méi)有mybatis的mapper.xml文件的問(wèn)題

    這篇文章主要介紹了如何解決Gradle、Maven項(xiàng)目build后沒(méi)有mybatis的mapper.xml文件的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • SpringMVC RESTful支持實(shí)現(xiàn)過(guò)程演示

    SpringMVC RESTful支持實(shí)現(xiàn)過(guò)程演示

    這篇文章主要介紹了SpringMVC RESTful支持實(shí)現(xiàn)過(guò)程演示,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Spring Boot + thymeleaf 實(shí)現(xiàn)文件上傳下載功能

    Spring Boot + thymeleaf 實(shí)現(xiàn)文件上傳下載功能

    最近同事問(wèn)我有沒(méi)有有關(guān)于技術(shù)的電子書(shū),我打開(kāi)電腦上的小書(shū)庫(kù),但是郵件發(fā)給他太大了,公司又禁止用文件夾共享,于是花半天時(shí)間寫(xiě)了個(gè)小的文件上傳程序,部署在自己的Linux機(jī)器上,需要的朋友可以參考下
    2018-01-01
  • SpringBoot監(jiān)控模塊Actuator的用法詳解

    SpringBoot監(jiān)控模塊Actuator的用法詳解

    Spring?Boot?Actuator?是?Spring?Boot?自帶的一個(gè)功能模塊,提供了一組已經(jīng)開(kāi)箱即用的生產(chǎn)環(huán)境下常用的特性和服務(wù),比如應(yīng)用程序的健康檢查、信息暴露、度量收集、日志記錄等,本文將給大家詳細(xì)SpringBoot監(jiān)控模塊Actuator的用法
    2023-06-06
  • spring boot整合mybatis使用c3p0數(shù)據(jù)源連接mysql

    spring boot整合mybatis使用c3p0數(shù)據(jù)源連接mysql

    這篇文章主要為大家詳細(xì)介紹了spring boot整合mybatis使用c3p0數(shù)據(jù)源連接mysql,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Java-Java5.0注解全面解讀

    Java-Java5.0注解全面解讀

    這篇文章主要介紹了Java-Java5.0注解全面解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Shiro:自定義Realm實(shí)現(xiàn)權(quán)限管理方式

    Shiro:自定義Realm實(shí)現(xiàn)權(quán)限管理方式

    這篇文章主要介紹了Shiro:自定義Realm實(shí)現(xiàn)權(quán)限管理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Spring中的@ConditionalOnProperty注解詳解

    Spring中的@ConditionalOnProperty注解詳解

    這篇文章主要介紹了Spring中的@ConditionalOnProperty注解詳解,常見(jiàn)的@Conditionalxxx開(kāi)頭的注解我們稱之為條件注解,常見(jiàn)的條件注解有,簡(jiǎn)單來(lái)講,一般是在配置類(lèi)上或者是@Bean修飾的方法上,添加此注解表示一個(gè)類(lèi)是否要被Spring上下文加載,需要的朋友可以參考下
    2024-01-01

最新評(píng)論

寻乌县| 通山县| 门源| 合阳县| 浪卡子县| 雷山县| 武隆县| 谷城县| 海林市| 临沭县| 长沙市| 华池县| 灯塔市| 大田县| 石棉县| 海口市| 漠河县| 鄂尔多斯市| 探索| 中阳县| 施秉县| 仪陇县| 光泽县| 襄城县| 苏尼特右旗| 宿州市| 汨罗市| 扎赉特旗| 凌源市| 织金县| 神农架林区| 岱山县| 苏尼特左旗| 且末县| 阿拉善左旗| 中宁县| 枣庄市| 新津县| 吉木乃县| 宁化县| 武穴市|