定時任務框架
TimeTask
從我們開始學習java開始,最先實現定時任務的時候都是採用TimeTask, Timer內部使用TaskQueue的類別存放定時任務,它是一個基於最小堆實作的優先權佇列。 TaskQueue會依照任務距離下一次執行時間的大小將任務排序,確保在堆頂的任務先執行。
實例程式碼:
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秒後執行了定時任務。
缺點:
TimeTask執行任務只能串列執行,一旦一個任務執行的時間比較長的話將會影響其他任務執行
執行任務過程如果發生異常,任務會直接停止。
隨著時間的推移,java的技術也在不斷的更新,針對TimeTask的不足,ScheduledExecutorService出現取代了TimeTask。
ScheduledExecutorService
ScheduledExecutorService是一個介面,有多個實作類,比較常用的是ScheduledThreadPoolExecutor。而ScheduledThreadPoolExecutor本身就是一個執行緒池,其內部使用 DelayQueue 作為任務佇列,並且支援任務並發執行。
實例程式碼:
public static void main(String[] args) throws InterruptedException { ScheduledExecutorService executorService = Executors.newScheduledThreadPool(3); // 执行任务: 每 10秒执行一次 executorService.scheduleAtFixedRate(() -> { System.out.println("执行任务:" + new Date()+",线程名称: " + Thread.currentThread().getName()); }, 1, 10, TimeUnit.SECONDS); }
缺點:
盡量避免用Executors方式去建立線程池,因為jdk自帶執行緒池內部使用的的隊列的比較大,很容易出現OOM。
定時任務是基於JVM單機記憶體形式的,一旦重啟定時任務就消失了。
無法支援cron表達式實現豐富的定時任務。
Spring Task
學習了Spring之後,開始使用了Spring 自帶的Task。 Spring Framework 自帶定時任務,提供了 cron 表達式來實現豐富定時任務配置。
實例程式碼:
@EnableScheduling @Component public class SpringTask { private Logger logger = LoggerFactory.getLogger(SpringTask.class); private static final SimpleDateFormat dateFormat = new SimpleDateFormat( "HH:mm:ss"); /** * fixedRate:固定速率执行。每5秒执行一次。 */ @Scheduled(fixedRate = 5000) public void invokeTaskWithFixedRate() { logger.info("Fixed Rate Task : Current Time is {}", dateFormat.format(new Date())); } /** * fixedDelay:固定延迟执行。距离上一次调用成功后2秒才执。 */ @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:初始延迟。任务的第一次执行将延迟5秒,然后将以5秒的固定间隔执行。 */ @Scheduled(initialDelay = 5000, fixedRate = 5000) public void invokeTaskWithInitialDelay() { logger.info("Task with Initial Delay : Current Time is {}", dateFormat.format(new Date())); } /** * cron:使用Cron表达式,每隔5秒执行一次 */ @Scheduled(cron = "0/5 * * * * ? ") public void invokeTaskWithCronExpression() { logger.info("Task Cron Expression: Current Time is {}", dateFormat.format(new Date())); } }
執行結果:
優點:2022-04-06 23:06:20.945 INFO 14604 --- [ scheduling-1] com.fw.task.SpringTask : Task Cron Expression: Current Time is : Task Cron Expression: Current Time is : Task Cron Expression: Current Time is : Task Cron Expression: Current Time is 23:06:00 14604 --- [ scheduling -1] com.fw.task.SpringTask : Task with Initial Delay : Current Time is 23:06:22## 2022-04-06 23:06:06967:# fw .task.SpringTask : Fixed Rate Task : Current Time is 23:06:22
@ EnableScheduling需要開啟定時任務,@Scheduled(cron = "0/5 * * * * ?")配置定時任務的規則。 cron表達式支援豐富定時任務配置,不熟悉的可以查看
2022-04-06 23:06:06:22
2022-04-06 23:06:55 .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 Current Time is 23: 06:25
2022-04-06 23:06:27.555 INFO 14604 --- [ scheduling-1] com.fw.task.SpringTask
2022-04-06 23:06:27.556 INFO 14604 --- [ scheduling-1] com.fw.task.SpringTask 1
使用簡單方便,支援各種複雜的定時任務配置
缺點:
- 基於單機形式定時任務,一旦重新啟動定時任務就消失了。
- 定時任務預設是單執行緒執行任務,如果需要並行執行需要開啟@EnableAsync。
- 沒有統一的圖形化任務排程的管理,無法控制定時任務
以上是Java單機環境怎麼實現定時任務的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本文討論了使用Maven和Gradle進行Java項目管理,構建自動化和依賴性解決方案,以比較其方法和優化策略。

本文使用Maven和Gradle之類的工具討論了具有適當的版本控制和依賴關係管理的自定義Java庫(JAR文件)的創建和使用。

本文討論了使用咖啡因和Guava緩存在Java中實施多層緩存以提高應用程序性能。它涵蓋設置,集成和績效優勢,以及配置和驅逐政策管理最佳PRA

本文討論了使用JPA進行對象相關映射,並具有高級功能,例如緩存和懶惰加載。它涵蓋了設置,實體映射和優化性能的最佳實踐,同時突出潛在的陷阱。[159個字符]

Java的類上載涉及使用帶有引導,擴展程序和應用程序類負載器的分層系統加載,鏈接和初始化類。父代授權模型確保首先加載核心類別,從而影響自定義類LOA

本文解釋了用於構建分佈式應用程序的Java的遠程方法調用(RMI)。 它詳細介紹了接口定義,實現,註冊表設置和客戶端調用,以解決網絡問題和安全性等挑戰。

本文詳細介紹了用於網絡通信的Java的套接字API,涵蓋了客戶服務器設置,數據處理和關鍵考慮因素,例如資源管理,錯誤處理和安全性。 它還探索了性能優化技術,我

本文詳細介紹了創建自定義Java網絡協議。 它涵蓋協議定義(數據結構,框架,錯誤處理,版本控制),實現(使用插座),數據序列化和最佳實踐(效率,安全性,維護


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

SublimeText3漢化版
中文版,非常好用

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

禪工作室 13.0.1
強大的PHP整合開發環境