亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

定時器任務 timer.schedule為什么每次任務都晚幾秒執行,還有到第二天0點的時候都晚

定時器任務 timer.schedule為什么每次任務都晚幾秒執行,還有到第二天0點的時候都晚

翻閱古今 2019-03-12 13:15:59
//創建一個定時器,在下一小時的第30分種第一次執行,然后每小時執行一次。[/color]private void startCollegeIPDay(){Timer timer = new Timer(true);long day = 24 * 60 * 60 * 1000;Calendar calendar = Calendar.getInstance();calendar.add(Calendar.DATE, 1);calendar.set(Calendar.HOUR_OF_DAY, 0);calendar.set(Calendar.MINUTE, 55);calendar.set(Calendar.SECOND, 0);timer.schedule(new CollegeDayIPTask(), calendar.getTime(), day);}[color=red]//任務task[/color]public class CollegeIPTask extends TimerTask {public CollegeIPTask() {}    @Override     public void run() {         try{              //業務邏輯         }catch (Exception e) {             e.printStackTrace();         }     }}第一次任務沒問題,但是從第二次開始沒次任務都晚幾秒執行,還有到第二天0點的時候直接0點50多分鐘才執行,1點的時候直接就2點多才執行,怎么回事?
查看完整描述

5 回答

?
qq_笑_17

TA貢獻1818條經驗 獲得超7個贊

堵塞了。是不是用了多進程之類的啊,可能會存在堵塞。還有一種可能是上次的任務還沒有執行完,然后這次任務也啟動了,也會存在這種問題的。建議優化一下代碼,然后定時盡量把時間隔開點,保證任務很在某個時間范圍內執行完。最后還有一個可能,檢查服務器的時間,是不是服務器時間和你本機對不上。


查看完整回答
反對 回復 2019-04-26
?
HUH函數

TA貢獻1836條經驗 獲得超4個贊

1、Timer
[quote]與每個 Timer 對象相對應的是單個后臺線程,用于[color=red]順序地執行所有計時器任務[/color]。計時器任務應該迅速完成。[color=red]如果完成某個計時器任務的時間太長,那么它會“獨占”計時器的任務執行線程[/color]。因此,這就可能延遲后續任務的執行,而這些任務就可能“堆在一起”,并且在上述不友好的任務最終完成時才能夠被快速連續地執行。[/quote]
所以如果任務多可能造成延遲

2、此類不 提供實時保證 所以晚幾秒很正常

3、
public void schedule(TimerTask task,
long delay,
long period)

[quote]安排指定的任務從指定的延遲后開始進行重復的固定延遲執行。以近似固定的時間間隔(由指定的周期分隔)進行后續執行。 
在固定延遲執行中,根據前一次執行的實際執行時間來安排每次執行。[color=red]如果由于任何原因(如垃圾回收或其他后臺活動)而延遲了某次執行,則后續執行也將被延遲。[/color][color=red]從長期來看,執行的頻率一般要稍慢于指定周期的倒數(假定 Object.wait(long) 所依靠的系統時鐘是準確的)。 [/color]

固定延遲執行適用于那些需要“平穩”運行的重復活動。換句話說,[color=red]它適用于在短期運行中保持頻率準確要比在長期運行中更為重要的活動。[/color]這包括大多數動畫任務,如以固定時間間隔閃爍的光標。這還包括為響應人類活動所執行的固定活動,如在按住鍵時自動重復輸入字符。 
[/quote]

所以不適合你的任務。 可以考慮 quartz。


查看完整回答
反對 回復 2019-04-26
  • 5 回答
  • 0 關注
  • 1657 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號