Java Timer 疑問

想請教 Java Timer 兩個 method 有咩分別

之前用開 method (1) ,個 runnable 跑跑吓會 shift 咗個時間,例如我有個 runnable 9:00:00am start。開頭十零廿次都差不多係00秒開始,但久而久之個一頭遲開始。

Google 過有人話用 method (2) , 但都係有 shift 的情況

Timer timer = new Timer();
(1) timer.scheduleAtFixedRate(...)
(2) timer.schedule(...)

想問問 (1) 同 (2) 有咩分別,點樣先可以 ensure 到 d Runnable 真係踏正 00秒就跑?

謝謝

Timer本身設計唔係高precision, 一定行得越耐shift得越勁
不論Java / C# / JS等都係咁

你要D野指定果一秒內做, 應該schedule住個task每秒都行幾次
每次run都check住system clock夠鐘未, 夠鐘就做野

再唔係就用OS既task scheduler

TOP

今日試咗每秒行一次呢個 approach 踏正 00 就跑,不過發現佢會久唔欠有1分鐘的00秒行幾次同一個動作。睇 code 未睇到原因

TOP

我個 Runnable 每踏正00/10/20/30/40/50秒就跑,間唔中會有1下跑多幾次。
[2022-06-17 14:10:20.020] Completed copying 604604 transactions ...: 3 ms
[2022-06-17 14:10:30.030] Completed copying 604604 transactions ...: 2 ms
[2022-06-17 14:10:40.040] Completed copying 604604 transactions ...: 2 ms
[2022-06-17 14:10:50.050] Completed copying 604604 transactions ...: 3 ms
[2022-06-17 14:11:00.000] Completed copying 604604 transactions ...: 4 ms
[2022-06-17 14:11:20.020] Completed copying 608044 transactions ...: 3 ms
[2022-06-17 14:11:20.020] Completed copying 608044 transactions ...: 2 ms
[2022-06-17 14:11:20.020] Completed copying 608044 transactions ...: 2 ms
[2022-06-17 14:11:20.020] Completed copying 608044 transactions ...: 2 ms
[2022-06-17 14:11:20.020] Completed copying 608044 transactions ...: 2 ms

[2022-06-17 14:11:30.030] Completed copying 608044 transactions ...: 3 ms
[2022-06-17 14:11:40.040] Completed copying 608044 transactions ...: 2 ms
[2022-06-17 14:11:50.050] Completed copying 608044 transactions ...: 3 ms
[2022-06-17 14:12:00.000] Completed copying 608044 transactions ...: 2 ms

TOP

唔知係唔係同 GC 有關,但都唔會重跑咁多次

TOP

本帖最後由 ghostkcleung 於 2022-6-19 10:52 編輯

你 Runnable 裡面,係涉及 copy,
會唔會係因為 asyn 咗某啲 resource ,
令到條 thread 喺度等緊或者 skip 咗。

同埋呢個情況,用 Thread 係咪比較簡單啲?

TOP

其實兩個都會等上一次完結才開始
如定3秒一次
分別是
scheduleAtFixedRate : 以上一次開始時間計3秒, 如已超過,即時開始下一次
schedule : 以上一次完結時間計3秒, 才開始下一次

TOP

回覆 4# zeroho


    是補回之前miss 了的? 看到14:11:10 miss 了

TOP

或者你可以試吓 dummy 一個 Runnable,
裡面完全唔做 copy 動作,
睇吓個結果會點。

我係懷疑未 free resource

TOP

回復 1 #zeroho

不用timer, 用thread 做,每次sleep 1s,
再比較時間再run task

via HKEPC Reader for Android

TOP