一、定時器:
顧名思義,定時器是定時執行的任務。定時器的應用場景很廣,比方說,定時更新排行榜的用戶信息、定時刷新首頁列表數據到緩存等等
二、Java中實現定時任務的幾種方式
1、原生態Timer,優點是方便快速,缺點是每一個任務都需要占用一個線程資源,而且任務拋異常出去后,定時任務下次就不會在執行了
2、ScheduledExecutorService,這是Java5以后提供的一個類,可以很方便的實現定時調度。
ScheduledExecutorServiceservice=Executors.newScheduledThreadPool(5);//創建調度服務,線程池數量為5
service.scheduleAtFixedRate(Runnablecommand,longinitialDelay,longperiod,TimeUnitunit);//開啟調度,command是所要執行的任務,initialDelay是初始化延時時間,period是調度周期,unit是時間單位
3、Spring提供的定時器,例如,以下例子是每一分鐘執行一次的任務
@Scheduled(cron="0*/1***?")
publicvoidupdateXxx(){...}
這種方式很方便,而且也是基于線程池的方式,數量可以通過xml配置。如果項目中有很多定時任務,那么就需要相對應的調大線程池數量,不然就得排隊了。
三、分布式定時器所遇到的問題
分布式定時器:簡單理解就是多個定時器同時部署,定時器中的各個任務相互協作
可能遇到的問題(包括但不限于此):
1、如何保證多個定時器中同一個任務只有一個在執行
2、如何避免死鎖
3、另一個詭異的問題是,明明已經加鎖了,但還是被重復執行了
四、解決方案
多個定時器中的同一個任務只有一個在執行。這個時候光靠Java本身提供的鎖機制是沒辦法實現的,需要借助第三方的力量,這里使用的是Redis,因為它高效,性能好、單節點支持qps已經超過了1萬,所以性能是非常高的。其中用到的是Redis的set命令。
原型是:SETkeyvalue[EXseconds][PXmilliseconds][NX|XX]
EXsecond:設置鍵的過期時間為second秒。
PXmillisecond:設置鍵的過期時間為millisecond毫秒。
NX:只在鍵不存在時,才對鍵進行設置操作。
XX:只在鍵已經存在時,才對鍵進行設置操作。
例子:
setmylock192.168.1.100EX5NX
上邊的例子中設置key為mylock,value為192.168.1.100,EX5表示過期時間為5秒鐘,NX表示當key不存在的時候再設置。這里為什么要把value設置為IP呢,原因是可以追蹤是誰占有著這把鎖。
設置成功時返回OK,失敗則返回nil,利用這個特性就可以實現分布式鎖了。其中設置5秒的過期時間可以避免死鎖的發生
以上就是動力節點java培訓機構的小編針對“Java基礎學習:java定時器”的內容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。
Java SE(Java Platform, Standard Edition,Java標準版),零基礎入門
Java SE(Java Platform, Standard Edition,Java標準版),基礎進階
隨著Java編程語言的大火,越來越多人也想通過參...
在大家看之前,我要先聲明兩點。1、由于我本人是J...
首先要做好學習前的準備工作:java語言一般用于...
編程語言Java,已經21歲了。從1995年誕生...
Java SE(Java Platform, Standard Edition,Java標準版),零基礎入門
Git是一個開源的分布式版本控制系統,用于敏捷高效地處理任何或小或大的項目
IDEA 全稱 IntelliJ IDEA,是java編程語言開發的集成環境,它所提倡的是智能編碼,是減少程序員的工作
Java SE(Java Platform, Standard Edition,Java標準版),基礎進階
jQuery是一個快速、簡潔的JavaScript框架
Docker 是一個基于 Go 語言 并遵從 Apache2.0 協議開源的應用容器引擎,讓開發者可以打包應用到一個可移植的鏡像中
動力節點在線報名表(此信息已加密,請放心填寫)