中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java單機環境如何實現定時任務

發布時間:2023-04-18 13:50:13 來源:億速云 閱讀:140 作者:iii 欄目:編程語言

今天小編給大家分享一下Java單機環境如何實現定時任務的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

定時任務框架

Java單機環境如何實現定時任務

TimeTask

從我們開始學習java開始,最先實現定時任務的時候都是采用TimeTask, Timer內部使用TaskQueue的類存放定時任務,它是一個基于最小堆實現的優先級隊列。TaskQueue會按照任務距離下一次執行時間的大小將任務排序,保證在堆頂的任務最先執行。

實例代碼:

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

運行結果:

當前時間: Wed Apr 06 22:05:04 CST 2022n線程名稱: main
當前時間: Wed Apr 06 22:05:09 CST 2022n線程名稱: Timer

從結果可以看出,5秒后執行了定時任務。

缺點:

  • TimeTask執行任務只能串行執行,一旦一個任務執行的時間比較長的話將會影響其他任務執行

  • 執行任務過程如果發生異常,任務會直接停止。

隨著時間的推移,java的技術也在不斷的更新,針對TimeTask的不足,ScheduledExecutorService出現替代了TimeTask。

ScheduledExecutorService

ScheduledExecutorService是一個接口,有多個實現類,比較常用的是ScheduledThreadPoolExecutor。而ScheduledThreadPoolExecutor本身就是一個線程池,其內部使用 DelayQueue 作為任務隊列,并且支持任務并發執行。

實例代碼:

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

缺點:

  • 盡量避免用Executors方式去創建線程池,因為jdk自帶線程池內部使用的的隊列的比較大,很容易出現OOM。

  • 定時任務是基于JVM單機內存形式的,一旦重啟定時任務就消失了。

  • 無法支持cron表達式實現豐富的定時任務。

Spring Task

學習了Spring之后,開始使用了Spring 自帶的Task。Spring Framework 自帶定時任務,提供了 cron 表達式來實現豐富定時任務配置。

實例代碼:

@EnableScheduling
@Component
public class SpringTask
{
    private Logger logger = LoggerFactory.getLogger(SpringTask.class);
    private static final SimpleDateFormat dateFormat = new SimpleDateFormat(
            "HH:mm:ss");
    /**
     * fixedRate:固定速率執行。每5秒執行一次。
     */
    @Scheduled(fixedRate = 5000)
    public void invokeTaskWithFixedRate()
    {
        logger.info("Fixed Rate Task :  Current Time  is  {}",
                dateFormat.format(new Date()));
    }
    /**
     * fixedDelay:固定延遲執行。距離上一次調用成功后2秒才執。
     */
    @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:初始延遲。任務的第一次執行將延遲5秒,然后將以5秒的固定間隔執行。
     */
    @Scheduled(initialDelay = 5000, fixedRate = 5000)
    public void invokeTaskWithInitialDelay()
    {
        logger.info("Task with Initial Delay : Current Time is  {}",
                dateFormat.format(new Date()));
    }
    /**
     * cron:使用Cron表達式,每隔5秒執行一次
     */
    @Scheduled(cron = "0/5 * * * * ? ")
    public void invokeTaskWithCronExpression()
    {
        logger.info("Task Cron Expression:  Current Time  is  {}",
                dateFormat.format(new Date()));
    }
}

執行結果:

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需要開啟定時任務,@Scheduled(cron = "0/5 * * * * ?")配置定時任務的規則。cron表達式支持豐富定時任務配置,不熟悉的的可以查看

優點:

使用簡單方便,支持各種復雜的定時任務配置

缺點:

  • 基于單機形式定時任務,一旦重啟定時任務就消失了。

  • 定時任務默認是單線程執行任務,如果需要并行執行需要開啟@EnableAsync。

  • 沒有統一的圖形化任務調度的管理,無法控制定時任務

以上就是“Java單機環境如何實現定時任務”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

长寿区| 石泉县| 昌宁县| 英德市| 榕江县| 视频| 昌平区| 康平县| 景谷| 文安县| 志丹县| 黔西县| 揭西县| 深泽县| 屏东市| 平远县| 辰溪县| 赣榆县| 育儿| 龙山县| 德钦县| 蚌埠市| 麻城市| 永安市| 东安县| 万州区| 襄汾县| 偃师市| 荣昌县| 嘉祥县| 措美县| 灌阳县| 翁源县| 靖安县| 泉州市| 墨玉县| 永登县| 阜平县| 江陵县| 阿拉善左旗| 册亨县|