欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java使用線程池執(zhí)行定時任務

 更新時間:2022年05月10日 09:44:29   作者:??Java中文社群????  
本文介紹了Java使用線程池執(zhí)行定時任務,其中ScheduledThreadPool和SingleThreadScheduledExecutor都是可以執(zhí)行定時任務的,但是具體怎么執(zhí)行,下面我們一起進入文章了解具體詳情吧

前言:

在 Java 語言中,有兩個線程池可以執(zhí)行定時任務:ScheduledThreadPool 和 SingleThreadScheduledExecutor,其中 SingleThreadScheduledExecutor 可以看做是 ScheduledThreadPool 的單線程版本,它的用法和 ScheduledThreadPool 是一樣的,所以本文重點來看 ScheduledThreadPool 線程池的使用。

ScheduledThreadPool 執(zhí)行定時任務的方法有以下 3 個:

  • 使用 schedule 方法執(zhí)行定時任務,只執(zhí)行一次定時任務。
  • 使用 scheduleAtFixedRate 方法執(zhí)行定時任務,執(zhí)行多次定時任務。
  • 使用 scheduleWithFixedDelay 方法執(zhí)行定時任務,執(zhí)行多次定時任務。

接下來我們看這 3 個方法的具體使用和區(qū)別。

1.schedule

schedule 方法只能執(zhí)行一次定時任務,它需要傳遞 3 個參數(shù):

  • 第 1 個參數(shù):傳遞一個任務,Runnable 或 Callable 對象;
  • 第 2 個參數(shù):添加定時任務后,再過多久開始執(zhí)行定時任務;
  • 第 3 個參數(shù):時間單位,配合參數(shù) 2 一起使用。

下面我們創(chuàng)建一個 3 秒以后執(zhí)行的定時任務:

import java.time.LocalDateTime;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class ScheduledThreadPoolExample {
    public static void main(String[] args) throws InterruptedException {
        // 創(chuàng)建 ScheduledThreadPool 線程池
        ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(10);
        System.out.println("schedule 方法添加任務:" + LocalDateTime.now());
        threadPool.schedule(new Runnable() {
            @Override
            public void run() {
                System.out.println("執(zhí)行 schedule 方法:" + LocalDateTime.now());
            }
        }, 3, TimeUnit.SECONDS); // 3s 之后執(zhí)行

        // 以下代碼是給業(yè)務方法一個時間對照信息
        TimeUnit.SECONDS.sleep(10); // 休眠 10s
        System.out.println("當前時間:" + LocalDateTime.now());
    }
}

以上程序的執(zhí)行結(jié)果如下圖所示: 

 從上述結(jié)果中可以看出,使用 schedule 方法只能執(zhí)行一次定時任務。

2.scheduleAtFixedRate

scheduleAtFixedRate 方法可以執(zhí)行多次定時任務,此方法需要 4 個參數(shù):

  • 第 1 個參數(shù):傳遞一個任務,Runnable 或 Callable 對象;
  • 第 2 個參數(shù):添加定時任務后,再過多久開始執(zhí)行定時任務;
  • 第 3 個參數(shù):定時任務執(zhí)行的時間間隔;
  • 第 4 個參數(shù):時間單位,配合參數(shù) 2 和參數(shù) 3 一起使用。

下面我們創(chuàng)建一個 3 秒后執(zhí)行的定時任務,每個定時任務執(zhí)行的時間間隔為 2 秒,

實現(xiàn)代碼如下:

import java.time.LocalDateTime;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class ScheduledThreadPoolExample {
    public static void main(String[] args) throws InterruptedException {
        // 創(chuàng)建 ScheduledThreadPool 線程池
        ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(10);
        System.out.println("scheduleAtFixedRate 方法添加任務:" + LocalDateTime.now());
        threadPool.scheduleAtFixedRate(new Runnable() {
                                           @Override
                                           public void run() {
                                               System.out.println("執(zhí)行 scheduleAtFixedRate 方法:" + LocalDateTime.now());
                                               // 休眠 2s
                                               try {
                                                   TimeUnit.SECONDS.sleep(2);
                                               } catch (InterruptedException e) {
                                                   e.printStackTrace();
                                               }
                                           }
                                       },
                3L, // 3s 后開始執(zhí)行定時任務
                2L, // 定時任務的執(zhí)行間隔為 2s
                TimeUnit.SECONDS); // 描述上面兩個參數(shù)的時間單位
    }
}

以上程序的執(zhí)行結(jié)果如下圖所示: 

 從上述結(jié)果可以看出,當任務添加成功之后,3s 后開始執(zhí)行第一個定時任務,之后每隔 2s 執(zhí)行一次定時任務。

3.scheduleWithFixedDelay

scheduleWithFixedDelay 方法的使用和 scheduleAtFixedRate 類似,但執(zhí)行效果完全不同,這個很容易理解如果效果一樣就不用創(chuàng)建兩個方法了。 scheduleWithFixedDelay 方法是在方法執(zhí)行完成之后,再隔 N 秒執(zhí)行下一個定時任務,和 scheduleAtFixedRate 的固定時間執(zhí)行不同,scheduleWithFixedDelay 方法的執(zhí)行受定時任務執(zhí)行的時長影響,

比如以下代碼:

import java.time.LocalDateTime;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class ScheduledThreadPoolExample {
    public static void main(String[] args) throws InterruptedException {
        // 創(chuàng)建 ScheduledThreadPool 線程池
        ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(10);
        System.out.println("scheduleWithFixedDelay 方法添加任務:" + LocalDateTime.now());
        threadPool.scheduleWithFixedDelay(new Runnable() {
                                              @Override
                                              public void run() {
                                                  System.out.println("執(zhí)行 scheduleWithFixedDelay 方法:" + LocalDateTime.now());
                                                  // 休眠 2s
                                                  try {
                                                      TimeUnit.SECONDS.sleep(2);
                                                  } catch (InterruptedException e) {
                                                      e.printStackTrace();
                                                  }
                                              }
                                          },
                3L, // 3s 后開始執(zhí)行定時任務
                2L, // 定時任務執(zhí)行完 2s 之后,再執(zhí)行下一個定時任務
                TimeUnit.SECONDS); // 描述上面兩個參數(shù)的時間單位
    }
}

以上程序的執(zhí)行結(jié)果如下圖所示: 

 從上述結(jié)果可以看出,定時任務在 3s 之后開始執(zhí)行,以后每隔 4s 執(zhí)行一次,這 4s 包含了,定時任務執(zhí)行花費的 2s,加上每隔 2s 執(zhí)行一次的時間間隔,也就是說 scheduleWithFixedDelay 是在任務執(zhí)行完 N 秒之后,再執(zhí)行下一次定時任務

總結(jié)

線程池執(zhí)行定時任務的實現(xiàn)方法有 3 個:

  • 使用 schedule 方法執(zhí)行定時任務,只執(zhí)行一次定時任務。
  • 使用 scheduleAtFixedRate 方法執(zhí)行定時任務,執(zhí)行多次定時任務,它的執(zhí)行時間間隔是固定的,不受定時任務執(zhí)行時長影響(定時任務時間間隔 > 任務執(zhí)行時間)。
  • 使用 scheduleWithFixedDelay 方法執(zhí)行定時任務,執(zhí)行多次定時任務,它是在定時任務執(zhí)行完之后,再隔 N 秒開始執(zhí)行下一次定時任務,它的執(zhí)行時間受定時任務執(zhí)行時長影響。

到此這篇關(guān)于Java使用線程池執(zhí)行定時任務的文章就介紹到這了,更多相關(guān)Java行定時任務內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java gbk轉(zhuǎn)utf-8

    Java gbk轉(zhuǎn)utf-8

    本文主要介紹了Java gbk轉(zhuǎn)utf-8的方法,具有一定的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • 詳解SpringCloud Finchley Gateway 統(tǒng)一異常處理

    詳解SpringCloud Finchley Gateway 統(tǒng)一異常處理

    這篇文章主要介紹了詳解SpringCloud Finchley Gateway 統(tǒng)一異常處理,非常具有實用價值,需要的朋友可以參考下
    2018-10-10
  • intellij IDEA配置springboot的圖文教程

    intellij IDEA配置springboot的圖文教程

    Spring Boot是由Pivotal團隊提供的全新框架,其設(shè)計目的是用來簡化新Spring應用的初始搭建以及開發(fā)過程。接下來通過本文給大家介紹intellij IDEA配置springboot的圖文教程,感興趣的朋友一起看看吧
    2018-03-03
  • 聊聊@Autowired注解注入,寫接口名字還是實現(xiàn)類的名字

    聊聊@Autowired注解注入,寫接口名字還是實現(xiàn)類的名字

    這篇文章主要介紹了聊聊@Autowired注解注入,寫接口名字還是實現(xiàn)類的名字,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • SpringMVC之簡單的增刪改查示例(SSM整合)

    SpringMVC之簡單的增刪改查示例(SSM整合)

    本篇文章主要介紹了SpringMVC之簡單的增刪改查示例(SSM整合),這個例子是基于SpringMVC+Spring+Mybatis實現(xiàn)的。有興趣的可以了解一下。
    2017-03-03
  • Java中的Rocketmq事務消息詳解

    Java中的Rocketmq事務消息詳解

    這篇文章主要介紹了Java中的Rocketmq事務消息詳解,RocketMQ的事務消息支持在業(yè)務邏輯與發(fā)送消息之間提供事務保證,RocketMQ通過兩階段的方式提供事務消息的支持,需要的朋友可以參考下
    2023-08-08
  • Springcloud Stream消息驅(qū)動工具使用介紹

    Springcloud Stream消息驅(qū)動工具使用介紹

    SpringCloud Stream由一個中間件中立的核組成,應用通過SpringCloud Stream插入的input(相當于消費者consumer,它是從隊列中接收消息的)和output(相當于生產(chǎn)者producer,它是發(fā)送消息到隊列中的)通道與外界交流
    2022-09-09
  • 詳解Java如何關(guān)閉線程以及線程池

    詳解Java如何關(guān)閉線程以及線程池

    java如何正確關(guān)閉線程以及線程池是一個高頻的面試題,本文將為大家詳細介紹實現(xiàn)的方法與代碼,感興趣的小伙伴快跟隨小編一起學習一下
    2022-04-04
  • SpringBoot自定義啟動器Starter流程詳解

    SpringBoot自定義啟動器Starter流程詳解

    SpringBoot中的starter是一種非常重要的機制,能夠拋棄以前繁雜的配置,將其統(tǒng)一集成進starter,應用者只需要在maven中引入starter依賴,SpringBoot就能自動掃描到要加載的信息并啟動相應的默認配置。starter讓我們擺脫了各種依賴庫的處理,需要配置各種信息的困擾
    2022-11-11
  • Java Date時間類型的操作實現(xiàn)

    Java Date時間類型的操作實現(xiàn)

    本文主要介紹Java Date 日期類型,以及Calendar的怎么獲取時間,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-03-03

最新評論