java中timer类包_Java~util包中Timer的使用, 演示cancel方法 和 对比schedule和scheduleAtFixedRate方法...
Timer
Timer類的主要作用就是設(shè)置計劃任務(wù),但封裝任務(wù)的類卻是TimerTask類
執(zhí)行計劃任務(wù)的代碼要放人TimerTask的子類中,因為TimerTask是一個抽象類。而且要重寫其run方法 因為這是一個抽象方法.
常見問題
任務(wù)執(zhí)行完了, 但進(jìn)程并沒有銷毀,
通過源碼查看構(gòu)造方法可以得知,創(chuàng)建一個 Timer就是啟動一個新的線程,這個新啟動的線程并不是守護(hù)線程,它一直在運行。
如果想要將其變?yōu)槭刈o(hù)線程就在初始化timer的時候傳入一個true
public class Demo1 {
public static void main(String[] args) throws InterruptedException {
Timer timer = new Timer(true);
Task task = new Task();
timer.schedule(task, 1000);
Thread.sleep(1000);
}
}
class Task extends TimerTask {
@Override
public void run() {
System.out.println("Listen");
}
}
如果我們定的執(zhí)行任務(wù)的時間在未來, 這種會在將來正常執(zhí)行, 如果我們定的任務(wù)在過去, 那么這個任務(wù)就立刻執(zhí)行.
TimerTask是以隊列的方式一個一個被順序執(zhí)行的,所以執(zhí)行的時間有可能和預(yù)期的時間不一致,因為前面的任務(wù)有可能消耗的時間較長,則后面的任務(wù)運行的時間也會被延遲。
方法schedule(Timer Task task, long delay)
該方法的作用是以執(zhí)行schedule(TimerTasktask,long delay)方法當(dāng)前的時間為參考時間,在此時間基礎(chǔ)上延遲指定的毫秒數(shù)delay后執(zhí)行一次TimerTask任務(wù)。
演示
public class Demo2 {
public static void main(String[] args) {
Timer timer = new Timer();
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
System.out.println("執(zhí)行時間: " + new Date().toString());
System.out.println("l love listen");
}
};
System.out.println("此時: " + new Date().toString());
timer.schedule(timerTask, 1000);
}
}
方法schedule(Timer Task task, long delay, long period)
該方法的作用是以執(zhí)行schedule ( TimerTask task, long delay, long period)方法當(dāng)前的時間為參考時間,在此時間基礎(chǔ)上延遲指定的毫秒數(shù)delay,再以某一間隔period時間無限次數(shù)地執(zhí)行某一任務(wù)。
演示
public class Demo3 {
public static void main(String[] args) {
Timer timer = new Timer();
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
System.out.println("執(zhí)行時間" + new Date().toString());
System.out.println("l love listen");
}
};
timer.schedule(timerTask, 1000, 1000);
}
}
凡是使用方法中帶有period參數(shù)的,都是無限循環(huán)執(zhí)行TimerTask中的任務(wù)。
cancel方法
TimerTask類的cancel()方法
TimerTask類中的cancel方法的作用是將自身從任務(wù)隊列中清除。
public class Demo4 {
public static void main(String[] args) {
Timer timer = new Timer();
TimerTask timerTask = new TimerTask() {
volatile int count = 0;
@Override
public void run() {
System.out.println("執(zhí)行時間" + new Date().toString());
System.out.println("l love listen");
count++;
if (count == 3) {
System.out.println("執(zhí)行cancel");
this.cancel();
}
}
};
timer.schedule(timerTask, 1000, 1000);
}
}
TimerTask類的cancel()方法是將自身從任務(wù)隊列中被移除,其他任務(wù)不受影響。
Timer類的cancel()方法
和TimerTask類中的cancel() 方法清除自身不同,Timer 類中的cancel()方法的作用是將任務(wù)隊列中的全部任務(wù)清空。
public class Demo5 {
public static void main(String[] args) {
Timer timer = new Timer();
//創(chuàng)建倆個task
TimerTask timerTask = new TimerTask() {
volatile int count = 0;
@Override
public void run() {
System.out.println("A 執(zhí)行時間" + new Date().getTime());
System.out.println("l love listen");
count++;
if (count == 3) {
System.out.println("執(zhí)行timer.cancel");
timer.cancel();
}
}
};
TimerTask timerTask1 = new TimerTask() {
@Override
public void run() {
System.out.println("B 執(zhí)行時間" + new Date().getTime());
System.out.println("l love swy");
}
};
timer.schedule(timerTask, 1000, 1000);
timer.schedule(timerTask1, 500, 500);
}
}
全部任務(wù)都被清除,并且進(jìn)程被銷毀,按鈕由紅色變成灰色。
timer.cancel的最常見一個問題
Timer類中的cancel()如果執(zhí)行了, 表示這個定時器就用不成了, 所以即使你再往定時器里加任務(wù), 也是不能執(zhí)行的
public class Demo6 {
public static void main(String[] args) {
Timer timer = new Timer();
//創(chuàng)建倆個task
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
System.out.println("A 執(zhí)行時間" + new Date().getTime());
System.out.println("l love listen");
}
};
TimerTask timerTask1 = new TimerTask() {
@Override
public void run() {
System.out.println("B 執(zhí)行時間" + new Date().getTime());
System.out.println("l love swy");
}
};
while (true) {
timer.schedule(timerTask, 1000, 1000);
timer.schedule(timerTask1, 500, 500);
timer.cancel();
}
}
}
對比schedule和scheduleAtFixedRate方法
方法schedule和方法scheduleAtFixedRate都會按順序執(zhí)行,所以不要考慮非線程安全的情況。方法schedule和scheduleAtFixedRate主要的區(qū)別只在于不延時的情況。使用schedule方法:如果執(zhí)行任務(wù)的時間沒有被延時,那么下一次任務(wù)的執(zhí)行時間參考的是上一次任務(wù)的“開始"時的時間來計算。
使用scheduleAtFixedRate方法:如果執(zhí)行任務(wù)的時間沒有被延時,那么下一次任務(wù)的執(zhí)行時間參考的是上一次任務(wù)的“結(jié)束”時的時間來計算。
延時的情況則沒有區(qū)別,也就是使用schedule或scheduleAtFixedRate方法都是如果執(zhí)行任務(wù)的時間被延時,那么下一次任務(wù)的執(zhí)行時間參考的是上一次任務(wù)“結(jié)束”時的時間來計算。
schedule方法不具有追趕性, 而scheduleAtFixedRate具有追趕性, 追趕性就是如果我們定的是循環(huán)執(zhí)行的任務(wù), 且定的任務(wù)在將來, 那么使用schedule不會彌補(bǔ)時間上的空缺, 而使用scheduleAtFixedRate會補(bǔ)充執(zhí)行, 把欠下的都執(zhí)行回來.
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的java中timer类包_Java~util包中Timer的使用, 演示cancel方法 和 对比schedule和scheduleAtFixedRate方法...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 登陆微博,PHP调用微博接口实现
- 下一篇: centos 使用java_如何在Cen