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

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

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

前言:

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

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

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

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

1.schedule

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

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

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

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 方法添加任務(wù):" + LocalDateTime.now());
        threadPool.schedule(new Runnable() {
            @Override
            public void run() {
                System.out.println("執(zhí)行 schedule 方法:" + LocalDateTime.now());
            }
        }, 3, TimeUnit.SECONDS); // 3s 之后執(zhí)行

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

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

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

2.scheduleAtFixedRate

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

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

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

實(shí)現(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 方法添加任務(wù):" + 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í)行定時(shí)任務(wù)
                2L, // 定時(shí)任務(wù)的執(zhí)行間隔為 2s
                TimeUnit.SECONDS); // 描述上面兩個(gè)參數(shù)的時(shí)間單位
    }
}

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

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

3.scheduleWithFixedDelay

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

比如以下代碼:

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 方法添加任務(wù):" + 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í)行定時(shí)任務(wù)
                2L, // 定時(shí)任務(wù)執(zhí)行完 2s 之后,再執(zhí)行下一個(gè)定時(shí)任務(wù)
                TimeUnit.SECONDS); // 描述上面兩個(gè)參數(shù)的時(shí)間單位
    }
}

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

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

總結(jié)

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

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

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

相關(guān)文章

  • Mybatis之@MapKey的實(shí)現(xiàn)

    Mybatis之@MapKey的實(shí)現(xiàn)

    本文介紹了Mybatis中@MapKey注解的使用場景與效果,包含使用@MapKey和不使用@MapKey注解的區(qū)別,然后通過源碼解析產(chǎn)生各種結(jié)果的原因,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-09-09
  • Spring?Boot實(shí)現(xiàn)分布式任務(wù)調(diào)度的步驟

    Spring?Boot實(shí)現(xiàn)分布式任務(wù)調(diào)度的步驟

    Spring?Boot提供了一些工具和框架,可以幫助我們輕松地實(shí)現(xiàn)分布式任務(wù)調(diào)度,在本文中我們將介紹如何使用Spring?Boot、Spring?Cloud、Quartz和Redis來實(shí)現(xiàn)分布式任務(wù)調(diào)度,感興趣的朋友跟隨小編一起看看吧
    2023-06-06
  • IDEA使用Lombok簡化POJO代碼的示例

    IDEA使用Lombok簡化POJO代碼的示例

    今天小編就為大家分享一篇關(guān)于IDEA使用Lombok簡化POJO代碼的示例,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • MyBatis-Plus自定義通用的方法實(shí)現(xiàn)

    MyBatis-Plus自定義通用的方法實(shí)現(xiàn)

    MP自帶的條件構(gòu)造器雖然很強(qiáng)大,有時(shí)候也避免不了寫稍微復(fù)雜一點(diǎn)業(yè)務(wù)的sql,本文主要介紹了MyBatis-Plus自定義通用的方法實(shí)現(xiàn),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • Java如何用時(shí)間戳重命名上傳的文件

    Java如何用時(shí)間戳重命名上傳的文件

    這篇文章主要介紹了Java如何用時(shí)間戳重命名上傳的文件問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • hibernate5.2的基本配置方法(詳解)

    hibernate5.2的基本配置方法(詳解)

    下面小編就為大家?guī)硪黄猦ibernate5.2的基本配置方法(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • 淺談java中字符串?dāng)?shù)組、字符串、整形之間的轉(zhuǎn)換

    淺談java中字符串?dāng)?shù)組、字符串、整形之間的轉(zhuǎn)換

    這篇文章主要介紹了淺談java中字符串?dāng)?shù)組、字符串、整形之間的轉(zhuǎn)換,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • ThreadLocal使用案例_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    ThreadLocal使用案例_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要介紹了ThreadLocal使用案例分析,需要的朋友可以參考下
    2017-08-08
  • 每日六道java新手入門面試題,通往自由的道路第二天

    每日六道java新手入門面試題,通往自由的道路第二天

    這篇文章主要為大家分享了最有價(jià)值的6道java面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,對(duì)hashCode方法的設(shè)計(jì)、垃圾收集的堆和代進(jìn)行剖析,感興趣的小伙伴們可以參考一下
    2021-06-06
  • Java非遞歸實(shí)現(xiàn)刪除任意目錄的方法

    Java非遞歸實(shí)現(xiàn)刪除任意目錄的方法

    這篇文章主要為大家詳細(xì)介紹了Java非遞歸實(shí)現(xiàn)刪除任意目錄的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05

最新評(píng)論

黎平县| 八宿县| 万载县| 抚宁县| 四子王旗| 玉田县| 香港 | 阿克陶县| 平顶山市| 满城县| 泰州市| 肇源县| 靖西县| 九寨沟县| 嘉禾县| 宣汉县| 新宁县| 屯昌县| 五华县| 德州市| 江西省| 海南省| 屯昌县| 西青区| 甘泉县| 伊宁市| 镇康县| 北碚区| 临漳县| 双峰县| 盐源县| 浦江县| 东乡族自治县| 郧西县| 文昌市| 淮阳县| 柞水县| 大安市| 四川省| 柳江县| 永德县|