更新時(shí)間:2020-03-27 13:45:39 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽3807次
一、定時(shí)器:
顧名思義,定時(shí)器是定時(shí)執(zhí)行的任務(wù)。定時(shí)器的應(yīng)用場(chǎng)景很廣,比方說(shuō),定時(shí)更新排行榜的用戶信息、定時(shí)刷新首頁(yè)列表數(shù)據(jù)到緩存等等
二、Java中實(shí)現(xiàn)定時(shí)任務(wù)的幾種方式
1、原生態(tài)Timer,優(yōu)點(diǎn)是方便快速,缺點(diǎn)是每一個(gè)任務(wù)都需要占用一個(gè)線程資源,而且任務(wù)拋異常出去后,定時(shí)任務(wù)下次就不會(huì)在執(zhí)行了
2、ScheduledExecutorService,這是Java5以后提供的一個(gè)類(lèi),可以很方便的實(shí)現(xiàn)定時(shí)調(diào)度。
ScheduledExecutorServiceservice=Executors.newScheduledThreadPool(5);//創(chuàng)建調(diào)度服務(wù),線程池?cái)?shù)量為5
service.scheduleAtFixedRate(Runnablecommand,longinitialDelay,longperiod,TimeUnitunit);//開(kāi)啟調(diào)度,command是所要執(zhí)行的任務(wù),initialDelay是初始化延時(shí)時(shí)間,period是調(diào)度周期,unit是時(shí)間單位
3、Spring提供的定時(shí)器,例如,以下例子是每一分鐘執(zhí)行一次的任務(wù)
@Scheduled(cron="0*/1***?")
publicvoidupdateXxx(){...}
這種方式很方便,而且也是基于線程池的方式,數(shù)量可以通過(guò)xml配置。如果項(xiàng)目中有很多定時(shí)任務(wù),那么就需要相對(duì)應(yīng)的調(diào)大線程池?cái)?shù)量,不然就得排隊(duì)了。
三、分布式定時(shí)器所遇到的問(wèn)題
分布式定時(shí)器:簡(jiǎn)單理解就是多個(gè)定時(shí)器同時(shí)部署,定時(shí)器中的各個(gè)任務(wù)相互協(xié)作
可能遇到的問(wèn)題(包括但不限于此):
1、如何保證多個(gè)定時(shí)器中同一個(gè)任務(wù)只有一個(gè)在執(zhí)行
2、如何避免死鎖
3、另一個(gè)詭異的問(wèn)題是,明明已經(jīng)加鎖了,但還是被重復(fù)執(zhí)行了
四、解決方案
多個(gè)定時(shí)器中的同一個(gè)任務(wù)只有一個(gè)在執(zhí)行。這個(gè)時(shí)候光靠Java本身提供的鎖機(jī)制是沒(méi)辦法實(shí)現(xiàn)的,需要借助第三方的力量,這里使用的是Redis,因?yàn)樗咝?,性能好、單?jié)點(diǎn)支持qps已經(jīng)超過(guò)了1萬(wàn),所以性能是非常高的。其中用到的是Redis的set命令。
原型是:SETkeyvalue[EXseconds][PXmilliseconds][NX|XX]
EXsecond:設(shè)置鍵的過(guò)期時(shí)間為second秒。
PXmillisecond:設(shè)置鍵的過(guò)期時(shí)間為millisecond毫秒。
NX:只在鍵不存在時(shí),才對(duì)鍵進(jìn)行設(shè)置操作。
XX:只在鍵已經(jīng)存在時(shí),才對(duì)鍵進(jìn)行設(shè)置操作。
例子:
setmylock192.168.1.100EX5NX
上邊的例子中設(shè)置key為mylock,value為192.168.1.100,EX5表示過(guò)期時(shí)間為5秒鐘,NX表示當(dāng)key不存在的時(shí)候再設(shè)置。這里為什么要把value設(shè)置為IP呢,原因是可以追蹤是誰(shuí)占有著這把鎖。
設(shè)置成功時(shí)返回OK,失敗則返回nil,利用這個(gè)特性就可以實(shí)現(xiàn)分布式鎖了。其中設(shè)置5秒的過(guò)期時(shí)間可以避免死鎖的發(fā)生

以上就是動(dòng)力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)的小編針對(duì)“Java基礎(chǔ)學(xué)習(xí):java定時(shí)器”的內(nèi)容進(jìn)行的回答,希望對(duì)大家有所幫助,如有疑問(wèn),請(qǐng)?jiān)诰€咨詢,有專(zhuān)業(yè)老師隨時(shí)為你服務(wù)。
相關(guān)閱讀
Java實(shí)驗(yàn)班
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
Java就業(yè)班
有基礎(chǔ) 直達(dá)就業(yè)
Java夜校直播班
業(yè)余時(shí)間 高薪轉(zhuǎn)行
Java在職加薪班
工作1~3年,加薪神器
Java架構(gòu)師班
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)