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

Java實(shí)現(xiàn)定時(shí)任務(wù)最簡單的3種方法

 更新時(shí)間:2022年06月13日 11:52:31   作者:深海吶  
幾乎在所有的項(xiàng)目中,定時(shí)任務(wù)的使用都是不可或缺的,如果使用不當(dāng)甚至?xí)斐少Y損,下面這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)定時(shí)任務(wù)最簡單的3種方法,本文通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

一、Timer

Timer是JAVA自帶的定時(shí)任務(wù)類,實(shí)現(xiàn)如下:

public class MyTimerTask {    
    public static void main(String[] args) {        
        // 定義一個(gè)任務(wù)       
        TimerTask timerTask = new TimerTask() {            
        @Override            
            public void run() {                
            System.out.println("打印當(dāng)前時(shí)間:" + new Date());    
            }       
         };        
        // 計(jì)時(shí)器       
        Timer timer = new Timer();       
        // 開始執(zhí)行任務(wù) (延遲1000毫秒執(zhí)行,每3000毫秒執(zhí)行一次)        
        timer.schedule(timerTask, 1000, 3000);    
    }
}

Timer 優(yōu)缺點(diǎn)分析

優(yōu)點(diǎn)是使用簡單,缺點(diǎn)是當(dāng)添加并執(zhí)行多個(gè)任務(wù)時(shí),前面任務(wù)的執(zhí)行用時(shí)和異常將影響到后面任務(wù),這邊深海建議謹(jǐn)慎使用。

二、ScheduledExecutorService

ScheduledExecutorService 也是Java自帶的類,

它可以實(shí)現(xiàn)Timer具備的所有功能,并解決了 Timer類存在的問題。

實(shí)現(xiàn)如下:

public class MyScheduledExecutorService {    
    public static void main(String[] args) {        
        // 創(chuàng)建任務(wù)隊(duì)列   10 為線程數(shù)量      
        ScheduledExecutorService scheduledExecutorService = 
                Executors.newScheduledThreadPool(10); 
        // 執(zhí)行任務(wù)      
        scheduledExecutorService.scheduleAtFixedRate(() -> {          
            System.out.println("打印當(dāng)前時(shí)間:" + new Date());      
        }, 1, 3, TimeUnit.SECONDS); // 1s 后開始執(zhí)行,每 3s 執(zhí)行一次   
 
  }
}

ScheduledExecutorService 優(yōu)缺點(diǎn)分析

優(yōu)點(diǎn)是,該類是JDK1.5自帶的類,使用簡單,缺點(diǎn)是該方案僅適用于單機(jī)環(huán)境。

三、Spring Task

Spring系列框架中Spring Framework自帶的定時(shí)任務(wù),

使用上面兩種方式,很難實(shí)現(xiàn)某些特定需求,比如每周一執(zhí)行某任務(wù),但SpringTask可輕松實(shí)現(xiàn)。

以SpringBoot為例來實(shí)現(xiàn):

1、開啟定時(shí)任務(wù)

在SpringBoot的啟動(dòng)類上聲明 @EnableScheduling:

@SpringBootApplication
@EnableScheduling //開啟定時(shí)任務(wù)
public class DemoApplication {  
     // --  -- 
}

2、添加定時(shí)任務(wù)

只需使用@Scheduled注解標(biāo)注即可,

如果有多個(gè)定時(shí)任務(wù),可以創(chuàng)建多個(gè)@Scheduled標(biāo)注的方法,示例如下:

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component // 把此類托管給 Spring,不能省略
public class TaskUtils {    
    // 添加定時(shí)任務(wù)    
    @Scheduled(cron = "30 40 23 0 0 5") // cron表達(dá)式:每周一 23:40:30 執(zhí)行    
    public void doTask(){        
        System.out.println("我是定時(shí)任務(wù)~");    
    }
}

 Spring Boot 啟動(dòng)后會(huì)自動(dòng)加載并執(zhí)行定時(shí)任務(wù),無需手動(dòng)操作。

Cron 表達(dá)式

Spring Task 的實(shí)現(xiàn)需要使用 cron 表達(dá)式來聲明執(zhí)行的頻率和規(guī)則,cron 表達(dá)式是由 6 位或者 7 位組成的(最后一位可以省略),每位之間以空格分隔,每位從左到右代表的含義如下:

其中 * 和 ? 號都表示匹配所有的時(shí)間。

cron 表達(dá)式在線生成地址:https://cron.qqe2.com/

知識擴(kuò)展:分布式定時(shí)任務(wù)

上面的方法都是關(guān)于單機(jī)定時(shí)任務(wù)的實(shí)現(xiàn),如果是分布式環(huán)境可以使用 Redis 來實(shí)現(xiàn)定時(shí)任務(wù)。

使用 Redis 實(shí)現(xiàn)延遲任務(wù)的方法大體可分為兩類:通過 ZSet 的方式和鍵空間通知的方式

1、ZSet 實(shí)現(xiàn)方式

通過 ZSet 實(shí)現(xiàn)定時(shí)任務(wù)的思路是,將定時(shí)任務(wù)存放到 ZSet 集合中,并且將過期時(shí)間存儲到 ZSet 的 Score 字段中,然后通過一個(gè)無線循環(huán)來判斷當(dāng)前時(shí)間內(nèi)是否有需要執(zhí)行的定時(shí)任務(wù),如果有則進(jìn)行執(zhí)行,具體實(shí)現(xiàn)代碼如下:

import redis.clients.jedis.Jedis;
import utils.JedisUtils;
import java.time.Instant;
import java.util.Set;
public class DelayQueueExample {        
    private static final String _KEY = "DelayQueueExample";        
    public static void main(String[] args) throws InterruptedException {        
        Jedis jedis = JedisUtils.getJedis();        
        // 30s 后執(zhí)行        
        long delayTime = Instant.now().plusSeconds(30).getEpochSecond();       
        jedis.zadd(_KEY, delayTime, "order_1");        
        // 繼續(xù)添加測試數(shù)據(jù)        
       jedis.zadd(_KEY, Instant.now().plusSeconds(2).getEpochSecond(), "order_2");       
      jedis.zadd(_KEY, Instant.now().plusSeconds(2).getEpochSecond(), "order_3");        
      jedis.zadd(_KEY, Instant.now().plusSeconds(7).getEpochSecond(), "order_4");        
     jedis.zadd(_KEY, Instant.now().plusSeconds(10).getEpochSecond(), "order_5");        
        // 開啟定時(shí)任務(wù)隊(duì)列        
        doDelayQueue(jedis);    
    }    
    /**     
    * 定時(shí)任務(wù)隊(duì)列消費(fèi)     
    * @param jedis Redis 客戶端     
    */    
    public static void doDelayQueue(Jedis jedis) throws InterruptedException {        
        while (true) {            
            // 當(dāng)前時(shí)間            
            Instant nowInstant = Instant.now();            
            long lastSecond = nowInstant.plusSeconds(-1).getEpochSecond(); 
            // 上一秒時(shí)間            
            long nowSecond = nowInstant.getEpochSecond();            
            // 查詢當(dāng)前時(shí)間的所有任務(wù)            
            Set data = jedis.zrangeByScore(_KEY, lastSecond, nowSecond);            
            for (String item : data) {                
            // 消費(fèi)任務(wù)                
            System.out.println("消費(fèi):" + item);            
        }            
        // 刪除已經(jīng)執(zhí)行的任務(wù)            
        jedis.zremrangeByScore(_KEY, lastSecond, nowSecond);            
        Thread.sleep(1000); // 每秒查詢一次        
        }    
    }
}

2、鍵空間通知

我們可以通過 Redis 的鍵空間通知來實(shí)現(xiàn)定時(shí)任務(wù),它的實(shí)現(xiàn)思路是給所有的定時(shí)任務(wù)設(shè)置一個(gè)過期時(shí)間,等到了過期之后,我們通過訂閱過期消息就能感知到定時(shí)任務(wù)需要被執(zhí)行了,此時(shí)我們執(zhí)行定時(shí)任務(wù)即可。

默認(rèn)情況下 Redis 是不開啟鍵空間通知的,需要我們通過 config set notify-keyspace-events Ex 的命令手動(dòng)開啟,開啟之后定時(shí)任務(wù)的代碼如下:

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPubSub;
import utils.JedisUtils;
public class TaskExample {    
    public static final String _TOPIC = "__keyevent@0__:expired"; // 訂閱頻道名稱   
    public static void main(String[] args) {       
        Jedis jedis = JedisUtils.getJedis();       
        // 執(zhí)行定時(shí)任務(wù)        
        doTask(jedis);    
    }   
     /**     
       * 訂閱過期消息,執(zhí)行定時(shí)任務(wù)     
       * @param jedis Redis 客戶端     
       */    
    public static void doTask(Jedis jedis) {        
        // 訂閱過期消息        
        jedis.psubscribe(new JedisPubSub() {            
            @Override            
 public void onPMessage(String pattern, String channel, String message) {                
            // 接收到消息,執(zhí)行定時(shí)任務(wù)                
            System.out.println("收到消息:" + message);            
            }            
        }, _TOPIC);    
    }
}

總結(jié)

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

相關(guān)文章

  • SpringBoot文件上傳大小設(shè)置方式(yml中配置)

    SpringBoot文件上傳大小設(shè)置方式(yml中配置)

    這篇文章主要介紹了SpringBoot文件上傳大小設(shè)置方式(yml中配置),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • SpringBoot Admin使用及心跳檢測原理分析

    SpringBoot Admin使用及心跳檢測原理分析

    這篇文章主要介紹了SpringBoot Admin使用及心跳檢測原理分析,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • java遞歸法求字符串逆序

    java遞歸法求字符串逆序

    這篇文章主要介紹了java遞歸法求字符串逆序,涉及java遞歸調(diào)用的相關(guān)操作技巧,需要的朋友可以參考下
    2015-05-05
  • springboot 中整合mybatis多數(shù)據(jù)源不使用JPA

    springboot 中整合mybatis多數(shù)據(jù)源不使用JPA

    這篇文章主要介紹了springboot 中整合mybatis多數(shù)據(jù)源不使用JPA,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • MyBatis中如何查詢某個(gè)時(shí)間段內(nèi)的數(shù)據(jù)

    MyBatis中如何查詢某個(gè)時(shí)間段內(nèi)的數(shù)據(jù)

    這篇文章主要介紹了MyBatis中如何查詢某個(gè)時(shí)間段內(nèi)的數(shù)據(jù),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • lombok插件無法使用的原因及解決方案

    lombok插件無法使用的原因及解決方案

    這篇文章主要介紹了lombok插件無法使用的原因及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • spring-boot整合dubbo:Spring-boot-dubbo-starter

    spring-boot整合dubbo:Spring-boot-dubbo-starter

    這篇文章主要介紹了spring-boot整合dubbo:Spring-boot-dubbo-starter的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-05-05
  • Java的Lock接口與讀寫鎖詳解

    Java的Lock接口與讀寫鎖詳解

    這篇文章主要介紹了Java的Lock接口與讀寫鎖詳解,鎖是用來控制多個(gè)線程訪問共享資源的方式,一般來說,一個(gè)鎖能夠防止多個(gè)線程同時(shí)訪問共享資源,但是有些鎖可以允許多個(gè)線程并發(fā)的訪問共享資源,比如讀寫鎖,需要的朋友可以參考下
    2023-12-12
  • kafka分布式消息系統(tǒng)基本架構(gòu)及功能詳解

    kafka分布式消息系統(tǒng)基本架構(gòu)及功能詳解

    這篇文章主要為大家介紹了kafka分布式消息系統(tǒng)基本架構(gòu)及功能詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • 一文帶你詳細(xì)認(rèn)識文件與Java中操作文件

    一文帶你詳細(xì)認(rèn)識文件與Java中操作文件

    文件處理是任何應(yīng)用程序的重要部分,Java 提供了許多用于創(chuàng)建、讀取、更新和刪除文件的方法,這篇文章主要給大家介紹了關(guān)于認(rèn)識文件與Java中操作文件的相關(guān)資料,需要的朋友可以參考下
    2024-05-05

最新評論

南安市| 江源县| 枣阳市| 屏南县| 固原市| 盱眙县| 五莲县| 安新县| 龙海市| 古蔺县| 孝感市| 龙岩市| 石景山区| 呼伦贝尔市| 囊谦县| 绥中县| 台湾省| 邹平县| 锦屏县| 湘阴县| 克山县| 昂仁县| 柘城县| 英德市| 邹平县| 观塘区| 石林| 阳曲县| 武川县| 美姑县| 集贤县| 海南省| 沅陵县| 滕州市| 大厂| 聂荣县| 海宁市| 八宿县| 隆化县| 高州市| 辽阳市|