今天小編給大家分享一下Java單機環(huán)境如何實現(xiàn)定時任務的相關知識點,內(nèi)容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
成都創(chuàng)新互聯(lián)主營歙縣網(wǎng)站建設的網(wǎng)絡公司,主營網(wǎng)站建設方案,app軟件開發(fā)公司,歙縣h5小程序設計搭建,歙縣網(wǎng)站營銷推廣歡迎歙縣等地區(qū)企業(yè)咨詢
從我們開始學習java開始,最先實現(xiàn)定時任務的時候都是采用TimeTask, Timer內(nèi)部使用TaskQueue的類存放定時任務,它是一個基于最小堆實現(xiàn)的優(yōu)先級隊列。TaskQueue會按照任務距離下一次執(zhí)行時間的大小將任務排序,保證在堆頂?shù)娜蝿兆钕葓?zhí)行。
實例代碼:
public static void main(String[] args) { TimerTask task = new TimerTask() { public void run() { System.out.println("當前時間: " + new Date() + "n" + "線程名稱: " + Thread.currentThread().getName()); } }; Timer timer = new Timer("Timer"); long delay = 5000L; timer.schedule(task, delay); System.out.println("當前時間: " + new Date() + "n" + "線程名稱: " + Thread.currentThread().getName()); }
運行結果:
當前時間: Wed Apr 06 22:05:04 CST 2022n線程名稱: main 當前時間: Wed Apr 06 22:05:09 CST 2022n線程名稱: Timer
從結果可以看出,5秒后執(zhí)行了定時任務。
缺點:
TimeTask執(zhí)行任務只能串行執(zhí)行,一旦一個任務執(zhí)行的時間比較長的話將會影響其他任務執(zhí)行
執(zhí)行任務過程如果發(fā)生異常,任務會直接停止。
隨著時間的推移,java的技術也在不斷的更新,針對TimeTask的不足,ScheduledExecutorService出現(xiàn)替代了TimeTask。
ScheduledExecutorService是一個接口,有多個實現(xiàn)類,比較常用的是ScheduledThreadPoolExecutor。而ScheduledThreadPoolExecutor本身就是一個線程池,其內(nèi)部使用 DelayQueue 作為任務隊列,并且支持任務并發(fā)執(zhí)行。
實例代碼:
public static void main(String[] args) throws InterruptedException { ScheduledExecutorService executorService = Executors.newScheduledThreadPool(3); // 執(zhí)行任務: 每 10秒執(zhí)行一次 executorService.scheduleAtFixedRate(() -> { System.out.println("執(zhí)行任務:" + new Date()+",線程名稱: " + Thread.currentThread().getName()); }, 1, 10, TimeUnit.SECONDS); }
缺點:
盡量避免用Executors方式去創(chuàng)建線程池,因為jdk自帶線程池內(nèi)部使用的的隊列的比較大,很容易出現(xiàn)OOM。
定時任務是基于JVM單機內(nèi)存形式的,一旦重啟定時任務就消失了。
無法支持cron表達式實現(xiàn)豐富的定時任務。
學習了Spring之后,開始使用了Spring 自帶的Task。Spring Framework 自帶定時任務,提供了 cron 表達式來實現(xiàn)豐富定時任務配置。
實例代碼:
@EnableScheduling @Component public class SpringTask { private Logger logger = LoggerFactory.getLogger(SpringTask.class); private static final SimpleDateFormat dateFormat = new SimpleDateFormat( "HH:mm:ss"); /** * fixedRate:固定速率執(zhí)行。每5秒執(zhí)行一次。 */ @Scheduled(fixedRate = 5000) public void invokeTaskWithFixedRate() { logger.info("Fixed Rate Task : Current Time is {}", dateFormat.format(new Date())); } /** * fixedDelay:固定延遲執(zhí)行。距離上一次調(diào)用成功后2秒才執(zhí)。 */ @Scheduled(fixedDelay = 2000) public void invokeTaskWithFixedDelay() { try { TimeUnit.SECONDS.sleep(3); logger.info("Fixed Delay Task : Current Time is {}", dateFormat.format(new Date())); } catch (InterruptedException e) { logger.error("invoke task error",e); } } /** * initialDelay:初始延遲。任務的第一次執(zhí)行將延遲5秒,然后將以5秒的固定間隔執(zhí)行。 */ @Scheduled(initialDelay = 5000, fixedRate = 5000) public void invokeTaskWithInitialDelay() { logger.info("Task with Initial Delay : Current Time is {}", dateFormat.format(new Date())); } /** * cron:使用Cron表達式,每隔5秒執(zhí)行一次 */ @Scheduled(cron = "0/5 * * * * ? ") public void invokeTaskWithCronExpression() { logger.info("Task Cron Expression: Current Time is {}", dateFormat.format(new Date())); } }
執(zhí)行結果:
2022-04-06 23:06:20.945 INFO 14604 --- [ scheduling-1] com.fw.task.SpringTask : Task Cron Expression: Current Time is 23:06:20
2022-04-06 23:06:22.557 INFO 14604 --- [ scheduling-1] com.fw.task.SpringTask : Task with Initial Delay : Current Time is 23:06:22
2022-04-06 23:06:22.557 INFO 14604 --- [ scheduling-1] com.fw.task.SpringTask : Fixed Rate Task : Current Time is 23:06:22
2022-04-06 23:06:25.955 INFO 14604 --- [ scheduling-1] com.fw.task.SpringTask : Fixed Delay Task : Current Time is 23:06:25
2022-04-06 23:06:25.955 INFO 14604 --- [ scheduling-1] com.fw.task.SpringTask : Task Cron Expression: Current Time is 23:06:25
2022-04-06 23:06:27.555 INFO 14604 --- [ scheduling-1] com.fw.task.SpringTask : Task with Initial Delay : Current Time is 23:06:27
2022-04-06 23:06:27.556 INFO 14604 --- [ scheduling-1] com.fw.task.SpringTask : Fixed Rate Task : Current Time is 23:06:27
@EnableScheduling需要開啟定時任務,@Scheduled(cron = "0/5 * * * * ?")配置定時任務的規(guī)則。cron表達式支持豐富定時任務配置,不熟悉的的可以查看
優(yōu)點:
使用簡單方便,支持各種復雜的定時任務配置
缺點:
基于單機形式定時任務,一旦重啟定時任務就消失了。
定時任務默認是單線程執(zhí)行任務,如果需要并行執(zhí)行需要開啟@EnableAsync。
沒有統(tǒng)一的圖形化任務調(diào)度的管理,無法控制定時任務
以上就是“Java單機環(huán)境如何實現(xiàn)定時任務”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
分享標題:Java單機環(huán)境如何實現(xiàn)定時任務
當前URL:http://jinyejixie.com/article40/gpsiho.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供建站公司、網(wǎng)站策劃、網(wǎng)站設計公司、動態(tài)網(wǎng)站、網(wǎng)站維護、Google
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)