日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java每五分钟执行_java关于Timer schedule执行定时任务 1、在应用开发中,经常需要一些周期性的操作,比如每5分钟执行某一操作等...

發布時間:2023/12/20 编程问答 31 豆豆

1、在應用開發中,經常需要一些周期性的操作,比如每5分鐘執行某一操作等。對于這樣的操作最方便、高效的實現方式就是使用java.util.Timer工具類。

private java.util.Timer timer;

timer = new Timer(true);

timer.schedule(

new java.util.TimerTask() { public void run() { //server.checkNewMail();?要操作的方法 } }, 0, 5*60*1000);

第一個參數是要操作的方法,第二個參數是要設定延遲的時間,第三個參數是周期的設定,每隔多長時間執行該操作。

使用這幾行代碼之后,Timer本身會每隔5分鐘調用一遍server.checkNewMail()方法,不需要自己啟動線程。Timer本身也是多線程同步的,多個線程可以共用一個Timer,不需要外部的同步代碼。

2、

(1)Timer.schedule(TimerTask task,Date time)安排在制定的時間執行指定的任務。

(2)Timer.schedule(TimerTask task,Date firstTime ,long period)安排指定的任務在指定的時間開始進行重復的固定延遲執行.

(3)Timer.schedule(TimerTask task,long delay)安排在指定延遲后執行指定的任務.

(4)Timer.schedule(TimerTask task,long delay,long period)安排指定的任務從指定的延遲后開始進行重復的固定延遲執行.

(5)Timer.scheduleAtFixedRate(TimerTask task,Date firstTime,long period)安排指定的任務在指定的時間開始進行重復的固定速率執行.

(6)Timer.scheduleAtFixedRate(TimerTask task,long delay,long period)安排指定的任務在指定的延遲后開始進行重復的固定速率執行.

以下內容根據?The?JavaTM?Tutorial?和相關API?doc翻譯整理,以供日后參考:

1.概覽

Timer是一種定時器工具,用來在一個后臺線程計劃執行指定任務。它可以計劃執行一個任務一次或反復多次。

TimerTask一個抽象類,它的子類代表一個可以被Timer計劃的任務。

簡單的一個例程:

importjava.util.Timer;

importjava.util.TimerTask;

/***?Simple?demo?that?uses?java.util.Timer?to?schedule?a?task?to?execute

*?once?5?seconds?have?passed.

*/

publicclassReminder?{

????Timer?timer;

????publicReminder(intseconds)?{

????????timer?=newTimer();

????????timer.schedule(newRemindTask(),?seconds*1000);

????}

????classRemindTask?extendsTimerTask?{

????????publicvoidrun()?{

????????????System.out.println("Time's?up!");

????????????timer.cancel();?//Terminate?the?timer?thread}????}

????publicstaticvoidmain(String?args[])?{

????????System.out.println("About?to?schedule?task.");

????????newReminder(5);

????????System.out.println("Task?scheduled.");

????}}

運行這個小例子,你會首先看到:

About?to?schedule?task.

5秒鐘之后你會看到:

Time's?up!

這個小例子可以說明一些用Timer線程實現和計劃執行一個任務的基礎步驟:

實現自定義的TimerTask的子類,run方法包含要執行的任務代碼,在這個例子里,這個子類就是RemindTask。

實例化Timer類,創建計時器后臺線程。

實例化任務對象?(new?RemindTask()).

制定執行計劃。這里用schedule方法,第一個參數是TimerTask對象,第二個參數表示開始執行前的延時時間(單位是milliseconds,這里定義了5000)。還有一種方法可以指定任務的執行時間,如下例,指定任務在11:01?p.m.執行:

//Get?the?Date?corresponding?to?11:01:00?pm?today.

Calendar?calendar?=?Calendar.getInstance();

calendar.set(Calendar.HOUR_OF_DAY,?23);

calendar.set(Calendar.MINUTE,?1);

calendar.set(Calendar.SECOND,?0);

Date?time?=?calendar.getTime();

timer?=?new?Timer();

timer.schedule(new?RemindTask(),?time);

2.終止Timer線程

默認情況下,只要一個程序的timer線程在運行,那么這個程序就會保持運行。當然,你可以通過以下四種方法終止一個timer線程:

調用timer的cancle方法。你可以從程序的任何地方調用此方法,甚至在一個timer?task的run方法里。

讓timer線程成為一個daemon線程(可以在創建timer時使用new?Timer(true)達到這個目地),這樣當程序只有daemon線程的時候,它就會自動終止運行。

當timer相關的所有task執行完畢以后,刪除所有此timer對象的引用(置成null),這樣timer線程也會終止。

調用System.exit方法,使整個程序(所有線程)終止。

Reminder

的例子使用了第一種方式。在這里不能使用第二種方式,因為這里需要程序保持運行直到timer的任務執行完成,如果設成daemon,那么當main線程

結束的時候,程序只剩下timer這個daemon線程,于是程序不會等timer線程執行task就終止了。

有些時候,程序的終止與

并不只與timer線程有關。舉個例子,如果我們使用AWT來beep,那么AWT會自動創建一個非daemon線程來保持程序的運行。下面的代碼我們對

Reminder做了修改,加入了beeping功能,于是我們需要加入System.exit的調用來終止程序。

importjava.util.Timer;

importjava.util.TimerTask;

importjava.awt.Toolkit;

/***?Simple?demo?that?uses?java.util.Timer?to?schedule?a?task?to?execute

*?once?5?seconds?have?passed.

*/

publicclassReminderBeep?{

????Toolkit?toolkit;

????Timer?timer;

????publicReminderBeep(intseconds)?{

????????toolkit?=Toolkit.getDefaultToolkit();

????????timer?=newTimer();

????????timer.schedule(newRemindTask(),?seconds*1000);

????}

????classRemindTask?extendsTimerTask?{

????????publicvoidrun()?{

????????????System.out.println("Time's?up!");

????toolkit.beep();

????//timer.cancel();?//Not?necessary?because?we?call?System.exitSystem.exit(0);???//Stops?the?AWT?thread?(and?everything?else)}????}

????publicstaticvoidmain(String?args[])?{

System.out.println("About?to?schedule?task.");

????????newReminderBeep(5);

System.out.println("Task?scheduled.");

????}}

3.反復執行一個任務

先看一個例子:

publicclassAnnoyingBeep?{

????Toolkit?toolkit;

????Timer?timer;

????publicAnnoyingBeep()?{

????????toolkit?=Toolkit.getDefaultToolkit();

????????timer?=newTimer();

????????timer.schedule(newRemindTask(),

???????????????0,????????//initial?delay1*1000);??//subsequent?rate}

????classRemindTask?extendsTimerTask?{

????????intnumWarningBeeps?=3;

????????publicvoidrun()?{

????????????if(numWarningBeeps?>0)?{

????????????????toolkit.beep();

????????????????System.out.println("Beep!");

????????????????numWarningBeeps--;

????????????}else{

????????????????toolkit.beep();?

????????????????System.out.println("Time's?up!");

????????????????//timer.cancel();?//Not?necessary?because?we?call?System.exitSystem.exit(0);???//Stops?the?AWT?thread?(and?everything?else)}????????}????}????...

}

執行,你會看到如下輸出:

Task?scheduled.

Beep!

Beep!??????//one?second?after?the?first?beep

Beep!??????//one?second?after?the?second?beep

Time's?up!?//one?second?after?the?third?beep

這里使用了三個參數的schedule方法用來指定task每隔一秒執行一次。如下所列為所有Timer類用來制定計劃反復執行task的方法?:

schedule(TimerTask?task,?long?delay,?long?period)

schedule(TimerTask?task,?Date?time,?long?period)

scheduleAtFixedRate(TimerTask?task,?long?delay,?long?period)

scheduleAtFixedRate(TimerTask?task,?Date?firstTime,?long?period)

計劃反復執行的任務時,如果你注重任務執行的平滑度,那么請使用schedule方法,如果你在乎的是任務的執行頻度那么使用

scheduleAtFixedRate方法。?例如,這里使用了schedule方法,這就意味著所有beep之間的時間間隔至少為1秒,也就是說,如

果有一個beap因為某種原因遲到了(未按計劃執行),那么余下的所有beep都要延時執行。如果我們想讓這個程序正好在3秒以后終止,無論哪一個

beep因為什么原因被延時,那么我們需要使用scheduleAtFixedRate方法,這樣當第一個beep遲到時,那么后面的beep就會以最快

的速度緊密執行(最大限度的壓縮間隔時間)。

4.進一步分析schedule和scheduleAtFixedRate

(1)

2個參數的schedule在制定任務計劃時,?如果指定的計劃執行時間scheduledExecutionTime<=

systemCurrentTime,則task會被立即執行。scheduledExecutionTime不會因為某一個task的過度執行而改變。

(2)

3個參數的schedule在制定反復執行一個task的計劃時,每一次執行這個task的計劃執行時間隨著前一次的實際執行時間而變,也就是

scheduledExecutionTime(第n+1次)=realExecutionTime(第n次)+periodTime。也就是說如果第n

次執行task時,由于某種原因這次執行時間過長,執行完后的systemCurrentTime>=

scheduledExecutionTime(第n+1次),則此時不做時隔等待,立即執行第n+1次task,而接下來的第n+2次task的

scheduledExecutionTime(第n+2次)就隨著變成了realExecutionTime(第n+1次)+periodTime。說

白了,這個方法更注重保持間隔時間的穩定。

(3)3個參數的scheduleAtFixedRate在制定反復執行一個task的計劃時,每一

執行這個task的計劃執行時間在最初就被定下來了,也就是scheduledExecutionTime(第n次)=firstExecuteTime

+n*periodTime;如果第n次執行task時,由于某種原因這次執行時間過長,執行完后的systemCurrentTime>=

scheduledExecutionTime(第n+1次),則此時不做period間隔等待,立即執行第n+1次task,而接下來的第n+2次的

task的scheduledExecutionTime(第n+2次)依然還是firstExecuteTime+(n+2)*periodTime這

在第一次執行task就定下來了。說白了,這個方法更注重保持執行頻率的穩定。

總結

以上是生活随笔為你收集整理的java每五分钟执行_java关于Timer schedule执行定时任务 1、在应用开发中,经常需要一些周期性的操作,比如每5分钟执行某一操作等...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久在线一区二区 | 干干日日 | 性欧美videos另类艳妇3d | 国产资源在线观看 | 国产精品99精品久久免费 | 人妻一区二区三区在线 | 国产91精品久久久久久久网曝门 | 不卡av网 | 日日夜夜免费精品视频 | 在线观看国产 | 亚洲乱子伦 | 日韩欧美综合一区 | 91免费高清 | 一女双乳被两男吸视频 | 久久久久久久 | 久久无码专区国产精品s | 亚洲自拍在线观看 | 成人精品福利 | 日韩1级片 | 国产精品手机视频 | 暴力调教一区二区三区 | 欧洲女女同videos | 夜夜精品一区二区无码 | 国产老熟女一区二区三区 | 日日摸日日碰夜夜爽无码 | 久久精品国产电影 | 人妻 日韩精品 中文字幕 | 丁香花电影免费播放在线观看 | 国产情侣免费视频 | 无码人妻精品一区二区三区9厂 | 伊人影音| 啊av在线| 欧美黄色大片免费看 | av动漫网| 激情视频区 | 解开人妻的裙子猛烈进入 | 久久久久久久久影院 | 精品亚洲国产成av人片传媒 | 久久国产一级 | 欧美大喷水吹潮合集在线观看 | 亚洲天堂视频在线播放 | 三级黄网| 男女午夜视频在线观看 | 亚洲成人aa | 亚洲精品无码专区 | 国产免费看片 | 中文永久免费观看 | 96精品国产 | 97超碰中文字幕 | 午夜肉伦伦影院 | 亚洲不卡视频在线观看 | 丰满少妇xbxb毛片日本 | 伊人草 | 91精品久久久久久久久久 | 久久亚洲精 | 岛国av一区二区三区 | 少妇激情在线 | 国产精品99久久久久久久女警 | 成人久色 | 99综合 | 婷婷四房综合激情五月 | 国产成人免费观看 | 色欧美日韩 | 国产在线视频不卡 | 99热这里只有精品3 成年人黄色网址 | 区一区二在线观看 | 国产sm在线观看 | 在线精品播放 | 国产一区二区视频播放 | 亚洲精品18在线观看 | 亚洲综合在线一区二区 | 毛片aaaaa| 成人黄色免费在线观看 | 午夜影院91 | 亚洲精品中文字幕在线播放 | 国内自拍在线 | 国产乱淫av免费 | 午夜激情av | 国产精品片 | 国产成人在线视频观看 | 精品影视一区二区 | 中文字幕资源在线 | av在线播放器 | 丁香婷婷一区二区三区 | 麻豆91精品91久久久 | 又粗又猛又爽又黄少妇视频网站 | 国产又大又黄的视频 | 性欧美熟妇videofreesex | 超碰碰碰 | 久草福利在线视频 | 羞羞色视频 | 免费看黄av| 97在线免费观看视频 | 亚洲精品人 | 国产小视频在线 | 国产露脸150部国语对白 | 少妇性高潮视频 | 奇米在线观看 | 午夜淫片 |