iT邦幫忙

2026 iThome 鐵人賽

DAY 2
0

關於原生Java的Schedule - 2

  • 深入看ScheduleExcutorService(我簡稱SES) ⭐⭐⭐⭐
    • 打開SES的原始碼,可以看到它是繼承ExecutorService,因此可以知道當我新建一個排程時,任務一樣是被丟到ThreadPool去執行,這也是昨天我比較Timer的一大重點。
    • 而排程的特性有幾個 : Period、Delay、Future
    • 不同Period的任務可能會 分配至不同的Thread執行
  • 怎麼建立一個ScheduleExcutorService? ⭐⭐⭐
    • 首先我們給定 corePoolSize :
      image
    • 當然,也有其他參數建構式,但這邊就用最簡單的就好了w
  • 任務完成後的回傳 : ScheduleFuture ⭐⭐⭐⭐⭐⭐
    • 當我們打開原始碼,可以發現每一個排程函式,都會回傳 ScheduleFuture<>,連Runnable排程函式都有,但我們都知道Runnable不會回傳,那為何需要Future?
      • 這是因為 ➝ ScheduleFuture取得物件後,可以使用 .cancel取消任務的排程(當然這建立在任務還沒被執行啦w,若已經開始了,則會嘗試使用interrupt去觸發try-catch)。
    • 而在 <> 也分為 <?>(for Runabble,無回傳) 及 <V>(for Callable)。
  • scheduleAtFixedRate vs. scheduleWithFixedDelay ⭐⭐⭐⭐
    • 關於scheduleAtFixedRate,其是週期性執行排程任務,然而當任務delay則,後續排程也會跟著delay(當前任務耗時大於Period,一結束前任務,後任務立刻執行),但一般情況下,其本質上就是 定期做某事 的函式。
    • 關於scheduleWithFixedDelay,其則是等前一個任務執行完畢後,根據設定的delay再多延遲幾秒,預留時間,最後才執行下一任務,確保 兩任務絕對不重複
    • 以下是基本範例 :
    schedule.scheduleWithFixedDelay(
        () -> {
            long seconds = System.currentTimeMillis() / 1000;
            System.out.println("Excuted at : " + seconds + " seconds");
            try{
                Thread.sleep(3000);
            }catch (InterruptedException e){
                System.out.print(e.getMessage());
            }
        },
        3, 3, TimeUnit.SECONDS
    ); // 意即每次執行任務間隔「至少」6秒
    

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


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

尚未有邦友留言

立即登入留言