日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

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

來源: 責編: 時間:2024-06-05 17:42:22 170觀看
導讀本文繼續討論 Netty 相關的面試題,今天咱們來看一道 Netty 中的高頻面試題:說說 Netty 延遲任務的時間輪調度算法?Netty 框架是以性能著稱的框架,因此在它的框架中使用了大量提升性能的機制,例如 Netty 用于實現延遲隊列的

fEU28資訊網——每日最新資訊28at.com

本文繼續討論 Netty 相關的面試題,今天咱們來看一道 Netty 中的高頻面試題:說說 Netty 延遲任務的時間輪調度算法?fEU28資訊網——每日最新資訊28at.com

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

1.延遲任務實現

在 Netty 中,我們需要使用 HashedWheelTimer 類來實現延遲任務,例如以下代碼:fEU28資訊網——每日最新資訊28at.com

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);    }}

以上程序的執行結果如下:fEU28資訊網——每日最新資訊28at.com

程序啟動時間:2024-06-04T10:16:23.033fEU28資訊網——每日最新資訊28at.com

執行任務時間:2024-06-04T10:16:26.118fEU28資訊網——每日最新資訊28at.com

從上述執行結果可以看出,我們使用 HashedWheelTimer 實現了延遲任務的執行。fEU28資訊網——每日最新資訊28at.com

2.時間輪調度算法

那么問題來了,HashedWheelTimer 是如何實現延遲任務的?什么是時間輪調度算法?fEU28資訊網——每日最新資訊28at.com

查看 HashedWheelTimer 類的源碼會發現,其實它是底層是通過時間輪調度算法來實現的,以下是 HashedWheelTimer 核心實現源碼(HashedWheelTimer 的創建源碼)如下:fEU28資訊網——每日最新資訊28at.com

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 節點,這樣就可以實現不同方向進行鏈表遍歷,如下圖所示:fEU28資訊網——每日最新資訊28at.com

fEU28資訊網——每日最新資訊28at.com

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

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

那么當時針走到第 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 之后執行。fEU28資訊網——每日最新資訊28at.com

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

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

本文鏈接:http://www.www897cc.com/showinfo-26-92120-0.html面試官:說說延遲任務的時間輪調度算法?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 利用Spring Boot和Elasticsearch進行人臉數據的高效檢索

下一篇: 微服務下認證授權框架的探討

標簽:
  • 熱門焦點
  • 服務存儲設計模式:Cache-Aside模式

    Cache-Aside模式一種常用的緩存方式,通常是把數據從主存儲加載到KV緩存中,加速后續的訪問。在存在重復度的場景,Cache-Aside可以提升服務性能,降低底層存儲的壓力,缺點是緩存和底
  • 從 Pulsar Client 的原理到它的監控面板

    背景前段時間業務團隊偶爾會碰到一些 Pulsar 使用的問題,比如消息阻塞不消費了、生產者消息發送緩慢等各種問題。雖然我們有個監控頁面可以根據 topic 維度查看他的發送狀態,
  • 2天漲粉255萬,又一賽道在抖音爆火

    來源:運營研究社作者 | 張知白編輯 | 楊佩汶設計 | 晏談夢潔這個暑期,旅游賽道徹底火了:有的「地方」火了&mdash;&mdash;貴州村超旅游收入 1 個月超過 12 億;有的「博主」火了&m
  • 本地生活這塊肥肉,拼多多也想吃一口

    出品/壹覽商業 作者/李彥編輯/木魚拼多多也看上本地生活這塊蛋糕了。近期,拼多多在App首頁&ldquo;充值中心&rdquo;入口上線了本機生活界面。壹覽商業發現,該界面目前主要
  • 得物寵物生意「狂飆」,發力“它經濟”

    作者|花花小萌主近日,得物宣布正式上線寵物鑒別,通過得物App內的&ldquo;在線鑒別&rdquo;,可找到鑒別寵物的選項。通過上傳自家寵物的部位細節,就能收獲擁有專業資質認證的得物鑒
  • 東方甄選單飛:有些鳥注定是關不住的

    文/彭寬鴻編輯/羅卿東方甄選創始人俞敏洪帶隊的&ldquo;7天甘肅行&rdquo;直播活動已在近日順利收官。成立后一年多時間里,東方甄選要脫離抖音自立門戶的傳聞不絕于耳,&ldquo;7
  • OPPO K11搭載高性能石墨散熱系統:旗艦同款 性能涼爽釋放

    日前OPPO官方宣布,將于7月25日14:30舉辦新品發布會,屆時全新的OPPO K11將正式與大家見面,將主打旗艦影像,和同檔位競品相比,其最大的賣點就是將配備索尼
  • Windows 11發布,微軟一改往常對老機型開放的態度

    距離 Windows 11 發布已經過去一周,在過去一周里,很多數碼愛好者圍繞其對 Android 應用的支持、對老機型的升級問題展開了激烈討論。與以往不同的是,在這次大
  • onebot M24巧系列一體機采用輕薄機身設計,現已在各平臺開售

    onebot M24 巧系列一體機目前已在線上線下各平臺同步開售。onebot M24 巧系列采用一體化輕薄機身設計,最薄處為 10.15mm,擁有寶石紅、午夜藍、石墨綠、雅致
Top 主站蜘蛛池模板: 香格里拉县| 河南省| 田阳县| 舒兰市| 双城市| 牡丹江市| 隆化县| 阆中市| 桐庐县| 阿鲁科尔沁旗| 饶河县| 额济纳旗| 营山县| 绥德县| 溧水县| 宁明县| 祥云县| 洛扎县| 高碑店市| 阿尔山市| 博野县| 壶关县| 基隆市| 景谷| 阳原县| 泗阳县| 鸡东县| 宜君县| 金阳县| 莒南县| 冀州市| 孟村| 定安县| 清徐县| 泸西县| 太康县| 游戏| 珠海市| 峨边| 抚顺县| 通江县|