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

Java中的ScheduledThreadPoolExecutor定時(shí)任務(wù)詳解

 更新時(shí)間:2023年12月28日 08:33:49   作者:Java都不學(xué)  
這篇文章主要介紹了Java中的ScheduledThreadPoolExecutor詳解,??ScheduledThreadPoolExecutor?繼承自?ThreadPoolExecutor,它主要用來(lái)在給定的延遲之后運(yùn)行任務(wù),或者定期執(zhí)行任務(wù),ScheduledThreadPoolExecutor?的功能與?Timer?類似<BR>,需要的朋友可以參考下

ScheduledThreadPoolExecutor詳解

ScheduledThreadPoolExecutor 繼承自 ThreadPoolExecutor。它主要用來(lái)在給定的延遲之后運(yùn)行任務(wù),或者定期執(zhí)行任務(wù)。

ScheduledThreadPoolExecutor 的功能與 Timer 類似, 但 ScheduledThreadPoolExecutor 功能更強(qiáng)大、更靈活。

Timer 對(duì)應(yīng)的是單個(gè)后臺(tái)線程,而 ScheduledThreadPoolExecutor 可以在構(gòu)造函數(shù)中指定多個(gè)對(duì)應(yīng)的后臺(tái)線程數(shù)。

ScheduledThreadPoolExecutor 的運(yùn)行機(jī)制

ScheduledThreadPoolExecutor 的任務(wù)傳遞示意圖

ScheduledThreadPoolExecutor 的執(zhí)行主要分為兩大部分:

1) 當(dāng)調(diào)用 ScheduledThreadPoolExecutor 的 scheduleAtFixedRate()方法或者 scheduleWithFixedDelay()方法時(shí),會(huì)向 ScheduledThreadPoolExecutor 的 DelayQueue 添加一個(gè)實(shí)現(xiàn)了 RunnableScheduledFutur 接口的 ScheduledFutureTask。

2) 線程池中的線程從 DelayQueue 中獲取 ScheduledFutureTask,然后執(zhí)行任務(wù)。

ScheduledThreadPoolExecutor 為了實(shí)現(xiàn)周期性的執(zhí)行任務(wù),對(duì) ThreadPoolExecutor 做 了如下的修改:

  •  使用 DelayQueue 作為任務(wù)隊(duì)列。
  • 獲取任務(wù)的方式不同。
  • 執(zhí)行周期任務(wù)后,增加了額外的處理。

ScheduledThreadPoolExecutor 的實(shí)現(xiàn)

ScheduledThreadPoolExecutor 會(huì)把待調(diào)度的任務(wù) (ScheduledFutureTask)放到一個(gè) DelayQueue 中。

ScheduledFutureTask 主要包含 3 個(gè)成員變量,如下。

  • long 型成員變量 time,表示這個(gè)任務(wù)將要被執(zhí)行的具體時(shí)間。
  • long 型成員變量 sequenceNumber,表示這個(gè)任務(wù)被添加到 ScheduledThreadPoolExecutor 中的序號(hào)。
  • long 型成員變量 period,表示任務(wù)執(zhí)行的間隔周期。

DelayQueue 封裝了一個(gè) PriorityQueue,這個(gè) PriorityQueue 會(huì)對(duì)隊(duì)列中的 ScheduledFutureTask 進(jìn)行排序。排序時(shí),time 小的排在前面(時(shí)間早的任務(wù)將被先執(zhí)行)。

如果兩個(gè) ScheduledFutureTask 的 time 相同,就比較 sequenceNumber,sequenceNumber 小的排在前面(也就是說(shuō),如果兩個(gè)任務(wù)的執(zhí)行時(shí)間相同,那么先提交的任務(wù)將被先執(zhí)行)。

ScheduledThreadPoolExecutor 中的線程執(zhí)行周期任務(wù)的過(guò)程

線程 1 從 DelayQueue 中獲取已到期的 ScheduledFutureTask(DelayQueue.take())。

到 期任務(wù)是指 ScheduledFutureTask 的 time 大于等于當(dāng)前時(shí)間。線程 1 執(zhí)行這個(gè) ScheduledFutureTask。

線程 1 修改 ScheduledFutureTask 的 time 變量為下次將要被執(zhí)行的時(shí)間。

線程 1 把這個(gè)修改 time 之后的 ScheduledFutureTask 放回 DelayQueue 中(DelayQueue.add())。

DelayQueue.take()方法

public E take() throws InterruptedException {
    final ReentrantLock lock = this.lock;
    lock.lockInterruptibly(); // 1  獲取響應(yīng)打斷的鎖
    try {
        for (; ; ) {
            E first = q.peek(); // 獲取ScheduledFutureTask 
            if (first == null) {
                available.await(); // 2.1 到 Condition 中等待
            } else {
                long delay = first.getDelay(TimeUnit.NANOSECONDS);
                if (delay > 0) {
                    // 2.2 到 Condition 中等待到 time 時(shí)間
                    long tl = available.awaitNanos(delay); 
                } else {
                    E x = q.poll(); // 2.3.1 獲取 PriorityQueue 的頭元素
                    assert x != null;
                    if (q.size() != 0)
                        available.signalAll(); // 2.3.2 喚醒在 Condition 中等待的所有線程
                    return x;
                }
            }
        }
    } finally {
        lock.unlock(); // 3 釋放??
    }
}

1) 獲取 Lock。

2) 獲取周期任務(wù)。

  • 如果 PriorityQueue 為空,當(dāng)前線程到 Condition 中等待;否則執(zhí)行下面的 2.2。
  • 如果 PriorityQueue 的頭元素的 time 時(shí)間比當(dāng)前時(shí)間大,到 Condition 中等待到 time 時(shí)間;否則執(zhí)行下面的 2.3。
  • 獲取 PriorityQueue 的頭元素(2.3.1);如果 PriorityQueue 不為空,則喚醒在 Condition 中等待的所有線程(2.3.2)。

3) 釋放 Lock。

ScheduledThreadPoolExecutor 在一個(gè)循環(huán)中執(zhí)行步驟 2,直到線程從 PriorityQueue 獲 取到一個(gè)元素之后(執(zhí)行 2.3.1 之后),才會(huì)退出無(wú)限循環(huán)(結(jié)束步驟 2)。

DelayQueue.offer()方法

// 把 ScheduledFutureTask 放入 DelayQueue 中的過(guò)程
public boolean offer(E e) {
    final ReentrantLock lock = this.lock;
    lock.lock(); // 1
    try {
        E first = q.peek();
        q.offer(e); // 2.1
        if (first == null || e.compareTo(first) < 0) available.signalAll(); // 2.2
        return true;
    } finally {
        lock.unlock(); // 3
    }
}

1) 獲取 Lock。

2) 添加任務(wù)。

  • 向 PriorityQueue 添加任務(wù)。
  • 如果在上面 2.1 中添加的任務(wù)是 PriorityQueue 的頭元素,喚醒在 Condition 中等 待的所有線程。

3) 釋放 Lock

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

相關(guān)文章

  • IntelliJ IDEA AI Assistant 攜帶OpenCode保姆級(jí)安裝教程

    IntelliJ IDEA AI Assistant 攜帶OpenCode保姆級(jí)

    本文介紹了JetBrains官方AI插件AIAssistant的安裝、使用及接入本地客戶端的過(guò)程,通過(guò)安裝、測(cè)試、接入本地客戶端等步驟,詳細(xì)描述了使用過(guò)程中的注意事項(xiàng)和操作方法,感興趣的朋友跟隨小編一起看看吧
    2026-04-04
  • Java抽象類和普通類區(qū)別、 數(shù)組跟List的區(qū)別解析

    Java抽象類和普通類區(qū)別、 數(shù)組跟List的區(qū)別解析

    這篇文章主要介紹了Java抽象類和普通類區(qū)別、 數(shù)組跟List的區(qū)別,在這里需要注意List是一個(gè)接口,不能直接實(shí)例化,需要使用具體的實(shí)現(xiàn)類來(lái)創(chuàng)建對(duì)象,本文結(jié)合示例代碼介紹的非常詳細(xì),需要的朋友參考下吧
    2023-09-09
  • SpringBoot圖文并茂講解登錄攔截器

    SpringBoot圖文并茂講解登錄攔截器

    其實(shí)spring boot攔截器的配置方式和springMVC差不多,只有一些小的改變需要注意下就ok了,下面這篇文章主要給大家介紹了關(guān)于如何在Springboot實(shí)現(xiàn)登陸攔截器功能的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • Java?Stream.reduce()用法詳細(xì)解析

    Java?Stream.reduce()用法詳細(xì)解析

    Stream API提供了豐富的中間函數(shù),歸并函數(shù)和終端函數(shù),這些函數(shù)還支持并行化執(zhí)行,下面這篇文章主要給大家介紹了關(guān)于Java?Stream.reduce()用法的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • springboot使用線程池(ThreadPoolTaskExecutor)示例

    springboot使用線程池(ThreadPoolTaskExecutor)示例

    大家好,本篇文章主要講的是springboot使用線程池(ThreadPoolTaskExecutor)示例,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • java網(wǎng)上圖書商城(1)User模塊

    java網(wǎng)上圖書商城(1)User模塊

    這篇文章主要介紹了java網(wǎng)上圖書商城,User模塊,實(shí)現(xiàn)用戶注冊(cè)功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • 用Java8 stream處理數(shù)據(jù)

    用Java8 stream處理數(shù)據(jù)

    這篇文章主要介紹了用Java8 stream處理數(shù)據(jù),Java 8 API的設(shè)計(jì)者重新提出了一個(gè)新的抽象稱為流Stream,可以讓我們以一種聲明的方式處理數(shù)據(jù),此外,數(shù)據(jù)流可以充分利用多核架構(gòu)而無(wú)需編寫多線程的一行代碼,下面我們一起來(lái)看看文章詳細(xì)介紹
    2021-11-11
  • 詳解path和classpath的區(qū)別

    詳解path和classpath的區(qū)別

    這篇文章主要介紹了詳解path和classpath的區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • java編程實(shí)現(xiàn)多人聊天室功能

    java編程實(shí)現(xiàn)多人聊天室功能

    這篇文章主要為大家詳細(xì)介紹了java編程實(shí)現(xiàn)多人聊天室功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Java 字符串連接的性能問(wèn)題分析

    Java 字符串連接的性能問(wèn)題分析

    這篇文章主要介紹了Java 字符串連接的性能問(wèn)題分析的相關(guān)資料,需要的朋友可以參考下
    2017-03-03

最新評(píng)論

泰宁县| 丹寨县| 安图县| 丰镇市| 洪湖市| 兰溪市| 肃北| 灵川县| 齐齐哈尔市| 大丰市| 金坛市| 夏邑县| 敦煌市| 威远县| 五华县| 泸西县| 确山县| 溧水县| 鸡西市| 平山县| 金塔县| 延津县| 南雄市| 龙南县| 深泽县| 阆中市| 汾阳市| 垫江县| 大邑县| 新巴尔虎左旗| 烟台市| 玉门市| 都昌县| 仲巴县| 营口市| 万州区| 进贤县| 黔江区| 定西市| 枝江市| 临沧市|