標題: Java Timer 疑問 [打印本頁]
作者: zeroho 時間: 2022-6-16 20:24 標題: 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秒就跑?
謝謝
作者: KinChungE 時間: 2022-6-16 21:36
Timer本身設計唔係高precision, 一定行得越耐shift得越勁
不論Java / C# / JS等都係咁
你要D野指定果一秒內做, 應該schedule住個task每秒都行幾次
每次run都check住system clock夠鐘未, 夠鐘就做野
再唔係就用OS既task scheduler
作者: zeroho 時間: 2022-6-18 01:43
今日試咗每秒行一次呢個 approach 踏正 00 就跑,不過發現佢會久唔欠有1分鐘的00秒行幾次同一個動作。睇 code 未睇到原因
作者: zeroho 時間: 2022-6-18 01:46
我個 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
作者: zeroho 時間: 2022-6-18 01:47
唔知係唔係同 GC 有關,但都唔會重跑咁多次
作者: ghostkcleung 時間: 2022-6-18 16:17
本帖最後由 ghostkcleung 於 2022-6-19 10:52 編輯
你 Runnable 裡面,係涉及 copy,
會唔會係因為 asyn 咗某啲 resource ,
令到條 thread 喺度等緊或者 skip 咗。
同埋呢個情況,用 Thread 係咪比較簡單啲?
作者: ffchung 時間: 2022-6-20 15:42
其實兩個都會等上一次完結才開始
如定3秒一次
分別是
scheduleAtFixedRate : 以上一次開始時間計3秒, 如已超過,即時開始下一次
schedule : 以上一次完結時間計3秒, 才開始下一次
作者: ffchung 時間: 2022-6-20 15:46
回覆 4# zeroho
是補回之前miss 了的? 看到14:11:10 miss 了
作者: ghostkcleung 時間: 2022-6-20 22:11
或者你可以試吓 dummy 一個 Runnable,
裡面完全唔做 copy 動作,
睇吓個結果會點。
我係懷疑未 free resource
作者: 大有仔 時間: 2022-6-22 19:09
回復 1 #zeroho
不用timer, 用thread 做,每次sleep 1s,
再比較時間再run task
via HKEPC Reader for Android
作者: 7h1r733n 時間: 2022-6-24 02:28
用Quartz
作者: zeroho 時間: 2022-7-2 08:10
是這個嗎?
http://www.quartz-scheduler.org/
作者: zeroho 時間: 2022-7-2 08:12
望落好多 feature 同有幾多 example 參考。謝分享。
