成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試官:說說延遲任務的時間輪調度算法?

開發 架構
Netty 框架是以性能著稱的框架,因此在它的框架中使用了大量提升性能的機制,例如 Netty 用于實現延遲隊列的時間輪調度算法就是一個典型的例子。使用時間輪算法可以實現海量任務新增和取消任務的時間度為 O(1),那么什么是時間輪調度算法呢?接下來我們一起來看。

本文繼續討論 Netty 相關的面試題,今天咱們來看一道 Netty 中的高頻面試題:說說 Netty 延遲任務的時間輪調度算法?

Netty 框架是以性能著稱的框架,因此在它的框架中使用了大量提升性能的機制,例如 Netty 用于實現延遲隊列的時間輪調度算法就是一個典型的例子。使用時間輪算法可以實現海量任務新增和取消任務的時間度為 O(1),那么什么是時間輪調度算法呢?接下來我們一起來看。

1.延遲任務實現

在 Netty 中,我們需要使用 HashedWheelTimer 類來實現延遲任務,例如以下代碼:

public class DelayTaskExample {
    public static void main(String[] args) {
        System.out.println("程序啟動時間:" + LocalDateTime.now());
        NettyTask();
    }

    private static void NettyTask() {
        // 創建延遲任務實例
        HashedWheelTimer timer = new HashedWheelTimer(3, // 間隔時間
                TimeUnit.SECONDS, // 間隔時間單位
                100); // 時間輪中的槽數
        // 創建任務
        TimerTask task = new TimerTask() {
            @Override
            public void run(Timeout timeout) throws Exception {
                System.out.println("執行任務時間:" + LocalDateTime.now());
            }
        };
        // 將任務添加到延遲隊列中
        timer.newTimeout(task, 0, TimeUnit.SECONDS);
    }
}

以上程序的執行結果如下:

程序啟動時間:2024-06-04T10:16:23.033

執行任務時間:2024-06-04T10:16:26.118

從上述執行結果可以看出,我們使用 HashedWheelTimer 實現了延遲任務的執行。

2.時間輪調度算法

那么問題來了,HashedWheelTimer 是如何實現延遲任務的?什么是時間輪調度算法?

查看 HashedWheelTimer 類的源碼會發現,其實它是底層是通過時間輪調度算法來實現的,以下是 HashedWheelTimer 核心實現源碼(HashedWheelTimer 的創建源碼)如下:

private static HashedWheelBucket[] createWheel(int ticksPerWheel) {
    // 省略其他代碼
    ticksPerWheel = normalizeTicksPerWheel(ticksPerWheel);
    HashedWheelBucket[] wheel = new HashedWheelBucket[ticksPerWheel];
    for (int i = 0; i < wheel.length; i ++) {
        wheel[i] = new HashedWheelBucket();
    }
    return wheel;
}
private static int normalizeTicksPerWheel(int ticksPerWheel) {
    int normalizedTicksPerWheel = 1;
    while (normalizedTicksPerWheel < ticksPerWheel) {
        normalizedTicksPerWheel <<= 1;
    }
    return normalizedTicksPerWheel;
}
private static final class HashedWheelBucket {
    private HashedWheelTimeout head;
    private HashedWheelTimeout tail;
    // 省略其他代碼
}

在 HashedWheelTimer  中,使用了 HashedWheelBucket 數組實現時間輪的概念,每個 HashedWheelBucket 表示時間輪中一個 slot(時間槽),HashedWheelBucket 內部是一個雙向鏈表結構,雙向鏈表的每個節點持有一個 HashedWheelTimeout 對象,HashedWheelTimeout 代表一個定時任務,每個 HashedWheelBucket 都包含雙向鏈表 head 和 tail 兩個 HashedWheelTimeout 節點,這樣就可以實現不同方向進行鏈表遍歷,如下圖所示:

時間輪算法的設計思想就來源于鐘表,如上圖所示,時間輪可以理解為一種環形結構,像鐘表一樣被分為多個 slot 槽位。每個 slot 代表一個時間段,每個 slot 中可以存放多個任務,使用的是鏈表結構保存該時間段到期的所有任務。時間輪通過一個時針隨著時間一個個 slot 轉動,并執行 slot 中的所有到期任務。

任務的添加是根據任務的到期時間進行取模,然后將任務分布到不同的 slot 中。如上圖所示,時間輪被劃分為 8 個 slot,每個 slot 代表 1s,當前時針指向 2 時,假如現在需要調度一個 3s 后執行的任務,應該加入 2+3=5 的 slot 中;如果需要調度一個 12s 以后的任務,需要等待時針完整走完一圈 round 零 4 個 slot,需要放入第 (2+12)%8=6 個 slot。

那么當時針走到第 6 個 slot 時,怎么區分每個任務是否需要立即執行,還是需要等待下一圈 round,甚至更久時間之后執行呢?所以我們需要把 round 信息保存在任務中。例如圖中第 6 個 slot 的鏈表中包含 3 個任務,第一個任務 round=0,需要立即執行;第二個任務 round=1,需要等待 1*8=8s 后執行;第三個任務 round=2,需要等待 2×8=8s 后執行。所以當時針轉動到對應 slot 時,只執行 round=0 的任務,slot 中其余任務的 round 應當減 1,等待下一個 round 之后執行。

可以看出時間輪有點類似 HashMap,如果多個任務如果對應同一個 slot,處理沖突的方法采用的是拉鏈法。在任務數量比較多的場景下,適當增加時間輪的 slot 數量,可以減少時針轉動時遍歷的任務個數。

時間輪定時器最大的優勢就是,任務的新增和取消都是 O(1) 時間復雜度,而且只需要一個線程就可以驅動時間輪進行工作。

責任編輯:姜華 來源: Java中文社群
相關推薦

2024-04-09 10:40:04

2024-10-22 16:39:07

2021-09-30 07:57:13

排序算法面試

2024-11-19 15:13:02

2025-04-08 00:00:00

@AsyncSpring異步

2023-12-27 18:16:39

MVCC隔離級別幻讀

2025-04-16 00:00:01

JWT客戶端存儲加密令

2024-08-22 10:39:50

@Async注解代理

2024-03-05 10:33:39

AOPSpring編程

2024-05-30 08:04:20

Netty核心組件架構

2021-09-16 07:52:18

算法應用場景

2024-02-20 08:13:35

類加載引用Class

2024-03-14 14:56:22

反射Java數據庫連接

2021-11-25 10:18:42

RESTfulJava互聯網

2024-07-31 08:28:37

DMAIOMMap

2024-12-06 07:00:00

2024-03-11 18:18:58

項目Spring線程池

2020-07-02 07:52:11

RedisHash映射

2021-08-09 07:47:40

Git面試版本

2024-03-22 06:56:24

零拷貝技術數據傳輸數據拷貝
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 黄视频国产 | 亚洲人成在线播放 | 午夜天堂精品久久久久 | 国产美女在线免费观看 | www.888www看片 | 国产亚洲精品美女久久久久久久久久 | 日韩中文不卡 | 欧美一区二区 | 中文字幕 在线观看 | 无码一区二区三区视频 | 成人在线视频一区二区三区 | 在线观看日本网站 | 男女羞羞视频大全 | 一区二区在线 | www国产亚洲精品久久网站 | www.日本精品 | 欧美中文字幕一区二区三区亚洲 | 免费一级做a爰片久久毛片潮喷 | 久久久久久久电影 | 亚洲一区国产精品 | 91看片视频| av无遮挡 | 欧美在线亚洲 | 九色 在线 | 91精品国产乱码久久久久久久久 | 日韩一级 | 99热最新| 亚洲精品一区二区三区蜜桃久 | 亚洲精品视频网站在线观看 | 麻豆av在线 | 欧美三级三级三级爽爽爽 | 91社区在线观看高清 | 香蕉久久久 | 亚欧洲精品在线视频免费观看 | 网页av| 男女午夜免费视频 | 狠狠狠色丁香婷婷综合久久五月 | 日韩精品一区二区三区在线播放 | 国产综合精品 | 亚洲国产aⅴ成人精品无吗 国产精品永久在线观看 | 2020天天操 |