java第五章 多线程_java多线程编程核心技术——第五章总结
定時器Timer的使用
在JDK中Timer類主要負(fù)責(zé)計劃任務(wù)的功能,也就是在指定的時間開始執(zhí)行某一個任務(wù)。
Timer類的主要作用是設(shè)置計劃任務(wù),但封裝任務(wù)的類卻是TimerTask類。
執(zhí)行計劃任務(wù)的代碼要放入TimerTask的子類中,因為TimerTask是一個抽象類。
注:在做Demo期間阿里的IDEA插件爆出建議:
多線程并發(fā)處理定時任務(wù)時,Timer運行多個TimerTask時,只要其中之一沒有捕獲拋出的異常,其它任務(wù)就會終止,使用ScheduledExecutorService則沒有這個問題。
1.執(zhí)行任務(wù)的時間晚于當(dāng)前時間:在未來執(zhí)行的效果。
Timer timer = new Timer();
這個構(gòu)造是獲取Timer對象的方式直接,這個構(gòu)造方法創(chuàng)建的是非守護(hù)線程。
TimerTask類似于線程(但并不是),他所執(zhí)行的的定時任務(wù)是重寫在run()方法中的(自定義任務(wù)類繼承TimerTask然后重寫了run())。
class MyTask extendsTimerTask {public voidrun(){}
}
MyTask task= newMyTask();//通過下面方法實現(xiàn)執(zhí)行定時任務(wù),date為要執(zhí)行run()的時間。
timer.schedule(task,date)
只要將date設(shè)置為未來的時間,且重寫run()方法,就可以在制定時間執(zhí)行想要做的定時任務(wù)了。
這個Timer的構(gòu)造是創(chuàng)建的是一個守護(hù)線程。
Timer timer = new Timer(true);
源碼如下:
這個空參構(gòu)造最終會調(diào)用下面的構(gòu)造
可以看出空參構(gòu)造的作用:創(chuàng)建一個Timer就是啟動一個新的線程,而且這個新線程并不是守護(hù)線程一直運行。
使用另一種構(gòu)造,則可以獲取守護(hù)線程:
2.計劃時間早于當(dāng)前時間,提前運行的效果
注:如果執(zhí)行任務(wù)的時間早于當(dāng)前時間,那么立即執(zhí)行task任務(wù)。
3.多個TimerTask任務(wù)及延時的測試
多個TimerTask可以被一個Timer執(zhí)行。調(diào)用的方法是:schedule(TimerTask task, Date time)。
TimerTask是以隊列的方式一個一個被順序執(zhí)行的,所以可能出現(xiàn)執(zhí)行的時間與預(yù)期的時間不一致的情況,因為前面的任務(wù)有可能消耗較長的時間,則后面的任務(wù)會被延遲。
該方法是在指定的日期后(firstTime)按指定的間隔(period)周期性地?zé)o限地執(zhí)行某一任務(wù)。
1.計劃時間晚于當(dāng)前時間:在未來執(zhí)行的結(jié)果
一旦當(dāng)前時間(本地計算機時間)到達(dá)指定時間(firstTime),TimerTask中的任務(wù)會被立即執(zhí)行,隨后每間隔一段時間(period)執(zhí)行一次。
2.計劃時間早于當(dāng)前時間:提前運行的效果
在當(dāng)前時間立即執(zhí)行TimerTask中的任務(wù),且每個一段時間(period)執(zhí)行一次。
注:起點以當(dāng)前線程啟動的時間為準(zhǔn),即調(diào)用schedule()方法為準(zhǔn),間隔也是以這個時間為起點。
3.任務(wù)執(zhí)行時間被延時
如果程序執(zhí)行的消耗時間大于間隔時間(period),那么任務(wù)的執(zhí)行就會延后,誰大以誰為準(zhǔn)。
注:消耗時間大,就以消耗時間為準(zhǔn);間隔時間大,就以間隔時間為準(zhǔn)。
4.TimerTask類的cancel()方法
TimerTask類的cancle()方法是將自身從任務(wù)隊列中移除,其他任務(wù)依舊在任務(wù)隊列不收影響。
5.Timer類的cancel()方法
Timer類的cancel()方法作用是將任務(wù)隊列中的全部任務(wù)清空。
注:調(diào)用cancel()后,全部任務(wù)被清空,進(jìn)程被銷毀。
注:Timer類的cancel()的注意事項:Timer類中的cancel()方法有時并不一定會停止執(zhí)行計劃任務(wù),而是正常執(zhí)行。
這是因為Timer類中的cancel()方法有時并沒有爭搶到queue鎖,所以TimerTask類中的任務(wù)繼續(xù)正常執(zhí)行。
(這個注意事項,我沒有想太明白,以后會再看的)
該方法的作用是以當(dāng)前時間為參考時間(這個當(dāng)前時間指的是調(diào)用schedule(TimerTask task,long delay)的時間),在此基礎(chǔ)上延遲指定毫秒數(shù)后執(zhí)行一次TimerTask任務(wù)。
該方法的作用是以當(dāng)前時間為參考時間(這個當(dāng)前時間指的是調(diào)用schedule(TimerTask task,long delay)的時間),在此基礎(chǔ)上延遲指定毫秒數(shù),再以某一間隔時間無限次地執(zhí)行某一任務(wù)。
方法schedule與方法scheduleAtFixedRate都會按順序執(zhí)行,所以不需要考慮非線程安全的情況。
方法schedule與方法scheduleAtFixedRate的主要區(qū)別在于不延時的情況。
使用schedule方法,如果執(zhí)行任務(wù)沒有被延時,那么下一次任務(wù)的執(zhí)行時間參考的是上一次任務(wù)的“開始”時的時間計算的。
使用scheduleAtFixedRate方法,如果執(zhí)行任務(wù)沒有被延時,那么下一次任務(wù)的執(zhí)行時間參考的是上一次任務(wù)的“結(jié)束”的時間計算的。
延時的情況則沒有區(qū)別,也就是說如果兩者都被延時,那么都已上一次任務(wù)結(jié)束的時間計算。
注:schedule不具有追趕性。
scheduleAtFixedRate具有追趕性。
追趕性:起始時間早于當(dāng)前時間,會將兩段時間內(nèi)的任務(wù)進(jìn)行追趕式(彌補錯過的時間)的執(zhí)行。
這只是定時器簡單的API實現(xiàn)。
實際上Spring通過了注解實現(xiàn)定時器,會找時間對其進(jìn)行總結(jié)的。
注解式定時器——SpringTask的實現(xiàn)(未完成)
本文內(nèi)容是書中內(nèi)容兼具自己的個人看法所成。可能在個人看法上會有諸多問題(畢竟知識量有限,導(dǎo)致認(rèn)知也有限),如果讀者覺得有問題請大膽提出,我們可以相互交流、相互學(xué)習(xí),歡迎你們的到來,心成意足,等待您的評價。
總結(jié)
以上是生活随笔為你收集整理的java第五章 多线程_java多线程编程核心技术——第五章总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 无需java安装_ubuntu配置jav
- 下一篇: Java实现二树杈_HashSet的ha