java多線(xiàn)程之定時(shí)器Timer的使用詳解
定時(shí)的功能我們?cè)谑謾C(jī)上見(jiàn)得比較多,比如定時(shí)清理垃圾,鬧鐘,等等.定時(shí)功能在java中主要使用的就是Timer對(duì)象,他在內(nèi)部使用的就是多線(xiàn)程的技術(shù).
Time類(lèi)主要負(fù)責(zé)完成定時(shí)計(jì)劃任務(wù)的功能,就是在指定的時(shí)間的開(kāi)始執(zhí)行某個(gè)任務(wù).
Timer類(lèi)的作用是設(shè)置計(jì)劃任務(wù),而封裝任務(wù)內(nèi)容的類(lèi)是TimerTask類(lèi).此類(lèi)是一個(gè)抽象類(lèi),繼承需要實(shí)現(xiàn)一個(gè)run方法.
通過(guò)查文檔我們看到Timer有以下幾個(gè)構(gòu)造函數(shù):
Timer的方法以下這么多:
下面我們通過(guò)定時(shí)器來(lái)完成一個(gè)簡(jiǎn)單功能,就是在運(yùn)行項(xiàng)目三秒后,在控制臺(tái)打印出"您該起床了",來(lái)模擬一下鬧鐘的功能:
package com.wang.reflect; import java.util.Timer; import java.util.TimerTask; class MyTask extends TimerTask{ @Override public void run() { System.out.println("您該起床了!!!!"); } } public class TimerDemo { public static void main(String[] args) { //創(chuàng)建定時(shí)器對(duì)象 Timer t=new Timer(); //在3秒后執(zhí)行MyTask類(lèi)中的run方法 t.schedule(new MyTask(), 3000); } }
運(yùn)行后,我們發(fā)現(xiàn)三秒后控制臺(tái)打印出了相當(dāng)?shù)奈淖?但是任務(wù)雖然執(zhí)行完了,進(jìn)程卻沒(méi)有銷(xiāo)毀,還是呈紅色狀態(tài),這是什么原因呢?
創(chuàng)建了一個(gè)Timer就相當(dāng)于啟動(dòng)了一個(gè)新線(xiàn)程,這個(gè)新線(xiàn)程并不是守護(hù)線(xiàn)程,所以會(huì)一直運(yùn)行.
在Time類(lèi)和TimerTask類(lèi)中都有一個(gè)cancel()方法.
TimerTask類(lèi)中的作用是:將自身從任務(wù)隊(duì)列中清除,(一個(gè)Timer對(duì)象可以執(zhí)行多個(gè)Timertask任務(wù))
Timer類(lèi)中的作用是:將任務(wù)隊(duì)列中的全部任務(wù)清空.
下面寫(xiě)一個(gè)實(shí)例,定時(shí)刪除指定磁盤(pán)某個(gè)目錄下的所有文件:
package com.wang.reflect; import java.io.File; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Timer; import java.util.TimerTask; class MyTask extends TimerTask{ /** * 定時(shí)刪除指定位置的文件,(這里以刪除f盤(pán)下aa文件夾的所有文件為例) */ @Override public void run() { File file=new File("f://aa"); deleteFolder(file); } public void deleteFolder(File file){ File[] files=file.listFiles(); for(File f:files){ if(f.isDirectory()){ //使用遞歸 deleteFolder(f); }else{ f.delete(); } } file.delete(); } } public class TimerDemo { public static void main(String[] args) throws ParseException { //創(chuàng)建定時(shí)器對(duì)象 Timer t=new Timer(); String time="2016-04-04 11:26:40"; Date d=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(time); t.schedule(new MyTask(), d); } }
注意,如果在上面測(cè)試代碼中,我給出的Date類(lèi)型的時(shí)間,早于當(dāng)前的時(shí)間.則會(huì)立即執(zhí)行task任務(wù).
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Spring Boot 整合 Mockito提升Java單元測(cè)試的高效實(shí)踐案例
Mockito與Spring Boot的整合為Java開(kāi)發(fā)者提供了一套完整的解決方案,使得單元測(cè)試更為精準(zhǔn)、高效,從而確保了代碼質(zhì)量、降低了維護(hù)成本,并促進(jìn)了項(xiàng)目的持續(xù)集成與交付,感興趣的朋友跟隨小編一起看看吧2024-04-04JavaWeb學(xué)習(xí)筆記之Filter和Listener
這篇文章主要給大家介紹了關(guān)于JavaWeb學(xué)習(xí)筆記之Filter和Listener的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03Java如何搭建一個(gè)個(gè)人網(wǎng)盤(pán)
這篇文章主要介紹了Java如何搭建一個(gè)個(gè)人網(wǎng)盤(pán),對(duì)網(wǎng)盤(pán)感興趣的讀者,可以參考一下2021-04-04Java8使用Supplier啟動(dòng)ScheduledThread代碼實(shí)例
這篇文章主要介紹了Java8使用Supplier啟動(dòng)ScheduledThread詳解,項(xiàng)目開(kāi)啟立即啟動(dòng)定時(shí)任務(wù)是很多項(xiàng)目都會(huì)遇到的一個(gè)需求,如何利用Java提供的函數(shù)優(yōu)雅的寫(xiě)出來(lái)十分考驗(yàn)一個(gè)人的功底,需要的朋友可以參考下2024-01-01Mybatis-plus批量去重插入ON DUPLICATE key update使用方式
這篇文章主要介紹了Mybatis-plus批量去重插入ON DUPLICATE key update使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12java使用內(nèi)存數(shù)據(jù)庫(kù)ssdb的步驟
這篇文章主要介紹了java使用內(nèi)存數(shù)據(jù)庫(kù)ssdb的步驟,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下2020-12-12SpringBoot如何接收前端傳來(lái)的json數(shù)據(jù)
這篇文章主要介紹了SpringBoot如何接收前端傳來(lái)的json數(shù)據(jù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04Spring中bean的初始化和銷(xiāo)毀幾種實(shí)現(xiàn)方式詳解
這篇文章主要介紹了Spring中bean的初始化和銷(xiāo)毀幾種實(shí)現(xiàn)方式詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11一篇文章帶你認(rèn)識(shí)Java8接口的默認(rèn)方法
這篇文章主要給大家介紹了如何通過(guò)一篇文章帶你認(rèn)識(shí)Java8接口的默認(rèn)方法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Java8具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05