LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

【定時(shí)任務(wù)核心】究竟是誰在負(fù)責(zé)盯著時(shí)間,并在恰當(dāng)時(shí)機(jī)觸發(fā)任務(wù)?

freeflydom
2025年7月12日 17:6 本文熱度 752

定時(shí)任務(wù)系統(tǒng)最核心的“靈魂”所在——究竟是誰在負(fù)責(zé)盯著時(shí)間,并在恰當(dāng)時(shí)機(jī)觸發(fā)任務(wù)? 這個(gè)問題的答案決定了整個(gè)系統(tǒng)的效率和精度。根據(jù)不同的實(shí)現(xiàn)模式,這個(gè)“守夜人”的角色由不同組件扮演:


??? 模式一:專用調(diào)度線程(基于優(yōu)先隊(duì)列/延遲隊(duì)列)

  • 誰在看時(shí)間? 一個(gè)或多個(gè)專用的調(diào)度線程(Scheduler Thread)
  • 如何工作?
    1. 睡眠與喚醒: 線程計(jì)算距離下一個(gè)任務(wù)到期的時(shí)間 (waitTime = nextTaskTime - now)。
    2. 精確阻塞: 調(diào)用 LockSupport.parkNanos(waitTime)condition.awaitNanos(waitTime) 或類似機(jī)制,讓線程精確睡眠 waitTime 這么長時(shí)間
    3. 中斷或超時(shí)喚醒:
      • 自然喚醒: 睡眠時(shí)間到,操作系統(tǒng)喚醒線程。
      • 外部喚醒: 如果新加入的任務(wù)比當(dāng)前隊(duì)首任務(wù)更早到期,會(huì)主動(dòng)中斷喚醒該線程(避免錯(cuò)過更早任務(wù))。
    4. 檢查與觸發(fā): 線程被喚醒后:
      • 檢查隊(duì)列頭部任務(wù)是否到期(now >= taskTime)。
      • 如果到期,將其從隊(duì)列移除,并提交給執(zhí)行線程池真正運(yùn)行。
      • 如果未到期(可能是被新任務(wù)提前喚醒),則重新計(jì)算 waitTime 并再次睡眠。
  • 特點(diǎn):
    • 主動(dòng)休眠: 線程大部分時(shí)間在精確休眠,CPU 占用低。
    • 高精度依賴: 精度依賴操作系統(tǒng)線程調(diào)度和休眠喚醒的精度(通常在毫秒級(jí))。
    • 單點(diǎn)瓶頸: 如果任務(wù)非常多或到期非常密集,單個(gè)調(diào)度線程可能成為瓶頸(需要處理堆操作和任務(wù)提交)。
  • 代表: ScheduledThreadPoolExecutor (Java), Quartz 默認(rèn)調(diào)度器。

?? 模式二:滴答線程(基于時(shí)間輪 - Timing Wheel)

  • 誰在看時(shí)間? 一個(gè)滴答驅(qū)動(dòng)線程(Tick Thread / Wheel Tick Thread)
  • 如何工作?
    1. 固定節(jié)奏推進(jìn): 線程以固定的時(shí)間間隔 (tickDuration,如 1ms, 10ms, 100ms) 醒來一次(通過 Thread.sleep(tickDuration)LockSupport.parkNanos(tickDuration) 或忙循環(huán)+精確等待實(shí)現(xiàn))。
    2. 移動(dòng)指針: 每次醒來,將時(shí)間輪的當(dāng)前指針移動(dòng)到下一個(gè)槽位 (Bucket/Slot)。這代表時(shí)間又前進(jìn)了一個(gè) tickDuration
    3. 處理槽位: 檢查當(dāng)前指向的槽位中的所有任務(wù):
      • 遍歷該槽位的任務(wù)鏈表。
      • 對每個(gè)任務(wù):將其剩余輪數(shù) (remainingRounds) 減 1。
      • 如果 remainingRounds == 0,則任務(wù)到期!將其從鏈表中移除,提交給執(zhí)行線程池運(yùn)行。
      • 如果 remainingRounds > 0,任務(wù)繼續(xù)留在槽中等待后續(xù)輪次。
      • 清空處理完的槽位(或?qū)⑵錁?biāo)記為空)。
    4. 處理新任務(wù): 在滴答間隙,新任務(wù)會(huì)根據(jù)其到期時(shí)間計(jì)算所屬槽位和輪數(shù),插入到對應(yīng)槽位的鏈表中。
  • 特點(diǎn):
    • 固定間隔輪詢: 線程按固定節(jié)奏醒來“掃一眼”當(dāng)前槽位,不管有沒有任務(wù)到期。
    • O(1) 高效: 觸發(fā)操作成本幾乎恒定(只處理一個(gè)槽位),與任務(wù)總量無關(guān),適合海量任務(wù)。
    • 精度受限: 任務(wù)觸發(fā)精度不會(huì)高于 tickDuration。設(shè)置更小的 tickDuration 追求高精度會(huì)顯著增加 CPU 開銷(線程更頻繁醒來)。
  • 代表: Netty HashedWheelTimer, Kafka 內(nèi)部定時(shí)器, Akka Scheduler。

模式三:操作系統(tǒng)/硬件中斷(基于 OS Timer)

  • 誰在看時(shí)間? 操作系統(tǒng)內(nèi)核和硬件定時(shí)器芯片(如 HPET, APIC)
  • 如何工作?
    1. 注冊定時(shí)器: 應(yīng)用程序通過系統(tǒng)調(diào)用(如 Linux 的 timerfd_createtimer_settime)告訴操作系統(tǒng):“在未來的 X 時(shí)間點(diǎn)(或 Y 納秒后),請通知我”。
    2. 硬件計(jì)時(shí): 硬件定時(shí)器芯片開始精確倒計(jì)時(shí)。
    3. 中斷通知: 到期時(shí)刻一到,硬件產(chǎn)生中斷 (Interrupt)
    4. 內(nèi)核處理: 內(nèi)核中斷處理程序捕獲該中斷。
    5. 通知應(yīng)用:
      • 信號(hào) (Signal): 內(nèi)核向應(yīng)用程序進(jìn)程發(fā)送特定信號(hào) (如 SIGALRM)。
      • 事件通知: 對于 timerfd 等,內(nèi)核將其標(biāo)記為“可讀”。
    6. 應(yīng)用響應(yīng):
      • (信號(hào)方式): 應(yīng)用程序預(yù)先注冊的信號(hào)處理函數(shù)被異步調(diào)用。該函數(shù)應(yīng)盡快將任務(wù)提交給執(zhí)行單元(注意信號(hào)處理函數(shù)的限制)。
      • (事件方式): 應(yīng)用程序的事件循環(huán)(如 epollkqueue)檢測到 timerfd 可讀,讀取事件,然后提交對應(yīng)的任務(wù)執(zhí)行。
  • 特點(diǎn):
    • 最高精度: 硬件級(jí)精度,可達(dá)微秒甚至納秒級(jí)。
    • 最低延遲: 中斷響應(yīng)速度極快。
    • 資源昂貴: 創(chuàng)建和管理大量 OS 定時(shí)器開銷大,不適合管理超大量任務(wù)。
    • 編程復(fù)雜: 涉及底層系統(tǒng)調(diào)用、異步信號(hào)處理(需非常小心)。
  • 代表: 實(shí)時(shí)系統(tǒng)、高頻交易系統(tǒng)、音視頻同步框架、timerfd + epoll 的自研高精度調(diào)度器。

?? 模式四:輪詢線程(基于掃描 - 最簡單,最低效)

  • 誰在看時(shí)間? 一個(gè)輪詢線程 (Polling Thread)
  • 如何工作?
    1. 固定間隔喚醒: 線程以固定間隔(如每 100ms)醒來一次。
    2. 遍歷所有任務(wù): 遍歷注冊的所有任務(wù)列表。
    3. 檢查時(shí)間: 對每個(gè)任務(wù),檢查當(dāng)前時(shí)間 now 是否 >= 其 nextFireTime
    4. 觸發(fā)與更新: 如果到期,觸發(fā)任務(wù)執(zhí)行,并更新其下一次觸發(fā)時(shí)間(如果是周期性任務(wù))。
    5. 休眠: 完成遍歷后,再次休眠固定間隔。
  • 特點(diǎn):
    • 簡單粗暴: 實(shí)現(xiàn)極其簡單。
    • 效率最低: O(n) 時(shí)間復(fù)雜度,任務(wù)越多性能越差。大量 CPU 浪費(fèi)在無意義的遍歷上。
    • 精度最差: 觸發(fā)時(shí)間精度不會(huì)高于輪詢間隔。提高精度需減小間隔,導(dǎo)致 CPU 空轉(zhuǎn)更嚴(yán)重。
  • 代表: 極簡單的嵌入式調(diào)度器、一些古老的 cron 實(shí)現(xiàn)(現(xiàn)代 cron 通常不這樣)。

?? 核心總結(jié):誰是“守夜人”?

實(shí)現(xiàn)模式誰在看時(shí)間?如何“看”?適用場景精度/效率特點(diǎn)
優(yōu)先隊(duì)列 (STPE等)專用調(diào)度線程精確睡眠等待 至最近任務(wù)到期時(shí)間任務(wù)量中等、時(shí)間離散、精度要求一般精度較高(ms級(jí)),海量任務(wù)時(shí)堆操作效率下降 O(log n)
時(shí)間輪 (Netty等)滴答線程固定間隔醒來 推進(jìn)指針,檢查當(dāng)前槽位任務(wù)海量任務(wù)、精度要求可接受(>=ms級(jí))效率極高 O(1),精度受 tickDuration 限制
OS定時(shí)器 (高精度)操作系統(tǒng)內(nèi)核 + 硬件定時(shí)器硬件中斷通知 應(yīng)用響應(yīng)信號(hào)或事件超低延遲、超高精度、任務(wù)量少精度最高 (μs/ns級(jí)),資源消耗大
輪詢 (簡單實(shí)現(xiàn))輪詢線程固定間隔遍歷 所有任務(wù)列表檢查極簡單場景、任務(wù)極少、精度要求極低效率最低 O(n),精度最低

最關(guān)鍵的區(qū)別在于“等待”的方式:

  1. 專用調(diào)度線程 (優(yōu)先隊(duì)列): “我知道下一個(gè)任務(wù)什么時(shí)候來,我先睡到那個(gè)點(diǎn)再起來干活。” (精確睡眠等待)
  2. 滴答線程 (時(shí)間輪): “我不管有沒有活,我每隔 X 時(shí)間就起來看一眼我的值班表(當(dāng)前槽位),有到期的活就干。” (固定間隔輪詢)
  3. OS/硬件中斷: “我在任務(wù)到期那個(gè)精確時(shí)刻會(huì)被硬件叫醒,立刻干活!” (中斷驅(qū)動(dòng) - 最精確)
  4. 輪詢線程: “我每隔 X 時(shí)間就起來把所有人的鬧鐘都檢查一遍,看看誰該醒了。” (低效輪詢)

因此:
定時(shí)任務(wù)的“觸發(fā)者”通常是一個(gè)或多個(gè)后臺(tái)線程(專用調(diào)度線程或滴答線程),在精心設(shè)計(jì)的隊(duì)列(優(yōu)先隊(duì)列)或數(shù)據(jù)結(jié)構(gòu)(時(shí)間輪)輔助下,它們通過精確休眠等待固定間隔輪詢或依賴操作系統(tǒng)中斷通知來知曉“時(shí)間到了”,并將到期任務(wù)提交給真正的執(zhí)行單元(通常是線程池)去運(yùn)行。硬件定時(shí)器則是這些軟件機(jī)制實(shí)現(xiàn)高精度的終極依賴。

轉(zhuǎn)自https://www.cnblogs.com/sun-10387834/p/18974791


該文章在 2025/7/12 17:06:48 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲(chǔ)管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
思思久久99热免费精品6 | 中文字幕在线精品乱码高 | 在线视频中文字幕久热 | 中文字幕久精品免费视频 | 日本真人作爱视频免费大全 | 日本亚洲欧美另类在线图片区 |