JAVA TIMER簡(jiǎn)單用法學(xué)習(xí)
Timer有兩種執(zhí)行任務(wù)的模式,最常用的是schedule,它可以以兩種方式執(zhí)行任務(wù):1:在某個(gè)時(shí)間(Data),2:在某個(gè)固定的時(shí)間之后(int delay).這兩種方式都可以指定任務(wù)執(zhí)行的頻率.看個(gè)簡(jiǎn)單的例子:
import java.io.IOException;
import java.util.Timer;
public class TimerTest {
public static void main(String[] args){
Timer timer = new Timer();
timer.schedule(new MyTask(), 1000, 2000);//在1秒后執(zhí)行此任務(wù),每次間隔2秒,如果傳遞一個(gè)Data參數(shù),就可以在某個(gè)固定的時(shí)間執(zhí)行這個(gè)任務(wù).
while(true){//這個(gè)是用來停止此任務(wù)的,否則就一直循環(huán)執(zhí)行此任務(wù)了
try {
int ch = System.in.read();
if(ch-'c'==0){
timer.cancel();//使用這個(gè)方法退出任務(wù)
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
static class MyTask extends java.util.TimerTask{
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("________");
}
}
}
如果你使用的是JDK 5+,還有一個(gè)scheduleAtFixedRate模 式可以用,在這個(gè)模式下,Timer會(huì)盡量的讓任務(wù)在一個(gè)固定的頻率下運(yùn)行,舉例說明:在上面的例子中,我們想讓MyTask在1秒鐘后,每兩秒鐘執(zhí)行一 次,但是因?yàn)閖ava不是實(shí)時(shí)的(其實(shí)java實(shí)時(shí)性很差.....),所以,我們?cè)谏蟼€(gè)程序中表達(dá)的原義并不能夠嚴(yán)格執(zhí)行.如果我們調(diào)用的是 scheduleAtFixedRate,那么,Timer會(huì)盡量讓你的Task執(zhí)行的頻率保持在2秒一次.運(yùn)行上面的程序,假設(shè)使用的是 scheduleAtFixedRate,那么下面的場(chǎng)景就是可能的:1秒鐘后,MyTask 執(zhí)行一次,因?yàn)橄到y(tǒng)繁忙,之后的2.5秒后MyTask 才得以執(zhí)行第二次,然后,Timer記下了這個(gè)延遲,并嘗試在下一個(gè)任務(wù)的時(shí)候彌補(bǔ)這個(gè)延遲,那么,1.5秒后,MyTask 將執(zhí)行的三次."以固定的頻率而不是固定的延遲時(shí)間去執(zhí)行一個(gè)任務(wù)"
下面給出一個(gè)復(fù)雜點(diǎn)的例子,其中告訴大家怎么退出單個(gè)TimerTask,怎么退出所有Task
package MyTimerTest;
import java.io.IOException;
import java.util.Timer;
/*
* 本類給出了使用Timer和TimerTaske的主要方法,其中包括定制任務(wù),添加任務(wù)
* 退出任務(wù),退出定時(shí)器.
* 因?yàn)門imerTask的status域是包級(jí)可訪問的,所以沒有辦法在java.util.包外
* 得到其狀態(tài),這對(duì)編程造成一些不便 .我們不能判斷某個(gè)Task的狀態(tài)了.
*
*/
public class TimerTest {
public static void main(String[] args) {
Timer timer = new Timer();
MyTask myTask1 = new MyTask();
MyTask myTask2 = new MyTask();
myTask2.setInfo("myTask-2");
timer.schedule(myTask1, 1000, 2000);
timer.scheduleAtFixedRate(myTask2, 2000, 3000);
while (true) {
try {
byte[] info = new byte[1024];
int len = System.in.read(info);
String strInfo = new String(info, 0, len, "GBK");//從控制臺(tái)讀出信息
if (strInfo.charAt(strInfo.length() - 1) == ' ') {
strInfo = strInfo.substring(0, strInfo.length() - 2);
}
if (strInfo.startsWith("Cancel-1")) { myTask1.cancel();//退出單個(gè)任務(wù)
// 其實(shí)應(yīng)該在這里判斷myTask2是否也退出了,是的話就應(yīng)該break.但是因?yàn)闊o法在包外得到
// myTask2的狀態(tài),所以,這里不能做出是否退出循環(huán)的判斷.
} else if (strInfo.startsWith("Cancel-2")) {
myTask2.cancel();
} else if (strInfo.startsWith("Cancel-All")) {
timer.cancel();//退出Timer
break;
} else {
// 只對(duì)myTask1作出判斷,偷個(gè)懶^_^
myTask1.setInfo(strInfo);
}
} catch (IOException e) { // TODO Auto-generated catch block
e.printStackTrace();
}
}
}
static class MyTask extends java.util.TimerTask {
String info = "^_^";
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println(info);
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
}
}
- java使用TimerTask定時(shí)器獲取指定網(wǎng)絡(luò)數(shù)據(jù)
- Java 定時(shí)器(Timer,TimerTask)詳解及實(shí)例代碼
- Java 兩種延時(shí)thread和timer詳解及實(shí)例代碼
- java定時(shí)任務(wù)Timer和TimerTask使用詳解
- Java定時(shí)任務(wù):利用java Timer類實(shí)現(xiàn)定時(shí)執(zhí)行任務(wù)的功能
- Java 定時(shí)器(Timer)及線程池里使用定時(shí)器實(shí)例代碼
- Java中Timer的用法詳解
- Java定時(shí)器Timer簡(jiǎn)述
- java之Timer和TimerTask簡(jiǎn)單demo(分享)
- java中timer的schedule和scheduleAtFixedRate方法區(qū)別詳解
相關(guān)文章
JAVA實(shí)現(xiàn)的簡(jiǎn)單萬年歷代碼
這篇文章主要介紹了JAVA實(shí)現(xiàn)的簡(jiǎn)單萬年歷代碼,涉及Java日期操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10Java 獲取Html文本中的img標(biāo)簽下src中的內(nèi)容方法
今天小編就為大家分享一篇Java 獲取Html文本中的img標(biāo)簽下src中的內(nèi)容方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-06-06利用Java實(shí)現(xiàn)在PDF中添加工具提示
這篇文章主要介紹了如何通過Java在PDF中添加工具提示,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定的參考價(jià)值,感興趣的可以學(xué)習(xí)一下2022-01-01Spring?Boot中的max-http-header-size配置方式
這篇文章主要介紹了Spring?Boot中的max-http-header-size配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09Spring與Dubbo搭建一個(gè)簡(jiǎn)單的分布式詳情
這篇文章主要介紹了Spring與Dubbo搭建一個(gè)簡(jiǎn)單的分布式詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08SpringBoot在一定時(shí)間內(nèi)限制接口請(qǐng)求次數(shù)的實(shí)現(xiàn)示例
在項(xiàng)目中,接口的暴露在外面,很多人就會(huì)惡意多次快速請(qǐng)求,本文主要介紹了SpringBoot在一定時(shí)間內(nèi)限制接口請(qǐng)求次數(shù)的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2022-03-03Spring+SpringMVC+MyBatis深入學(xué)習(xí)及搭建(一)之MyBatis的基礎(chǔ)知識(shí)
這篇文章主要介紹了Spring+SpringMVC+MyBatis深入學(xué)習(xí)及搭建(一)之MyBatis的基礎(chǔ)知識(shí),需要的朋友可以參考下2017-05-05