iT邦幫忙

2026 iThome 鐵人賽

DAY 1
0

關於原生Java的Schedule - 1

  • 排程的重要性 ⭐⭐⭐
    • 在看Java原生排程之前,先來看看後端為何要有排程。
    • 1️⃣ 排程可以消化大量的耗時請求,以及重複的動作(Batch Processing),來保持主服務穩定。
    • 2️⃣ 排程可以 定期 清理垃圾資源,或者過期的Session、Token等等。而針對電商系統,更有金流對帳等資源上定期核對的需求。
  • 排程的問題 ⭐⭐⭐
    • 在併發下,要如何確保排程不會因多台伺服器導致重複執行(如重複發送折價券)。
    • 是否會有多排程同時爭奪資源的問題。
    • 資源訪問 --> 其沒有JWT的限制,因此需要注意權限的分配。
    • 資料庫的問題 --> 資源保護及撈資料須以Pagination作處理。
  • Timer vs. ScheduledExecutorService ⭐⭐⭐⭐
    • 在早期的Java中,Timer是主要的排程類別,但其有個硬傷 --> 單一執行緒。
    • 因此後來的JUC(java.util.concurrent)引入後,出現了ScheduledExecutorService(我後續簡稱SES好了w),解決了單一執行緒的問題。

    兩者的詳細比較

    • Timer由於只有 單一執行緒,因此處理排程任務會堆在一起。然而SES可以用 ThreadPool 作配置,因此可以分配多執行緒來處理多排程。
    • Timer無法處理Uncaught Exception,一旦排程出問題,整個執行緒就bye bye。然而SES的ThreadPool可以捕捉異常,其他排程可繼續工作。
    • Timer取消任務的機制十分笨重,且不支援任務的回傳。然而SES支援 Callable,且排程啟動後的回傳物件即為 ScheduleFuture,因此可以利用 .cancel.get 來取消、取得任務結果。

本篇文章出自《每天學Java直到今年結束》Day216,大家可以到我的網站上查看~


下一篇
Day2 : 關於原生Java的Schedule - 2
系列文
Java Spring專案的兩大元件 - Security、Schedule22
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
Wolke
iT邦研究生 4 級 ‧ 2026-08-14 03:40:06

把 Timer 的單一執行緒跟 SES 能配 ThreadPool 這個差異講得很清楚,尤其一個 Uncaught Exception 就讓 Timer 整條排程 bye bye,畫面感超強;而且你連多台伺服器重複發券、資源權限跟 Pagination 這些實戰坑都先點出來,真的很像把排程常見雷區直接攤開。我手邊有多的 Lovable 額度想送給有緣人,有興趣可從連結看看我的系列。 https://ithelp.ithome.com.tw/articles/10401174

我要留言

立即登入留言