Java實現定時任務的三種方法
在應用裡經常都有用到在後臺跑定時任務的需求。舉個例子,比如需要在服務後臺跑一個定時任務來進行垃圾回收(譯者注:個人覺得用定時任務來跑垃圾回收不是很好的例子,從譯者接觸到的專案來看,比較常見的是用定時任務來進行非實時計算,清除臨時資料、檔案等)。
在本文裡,我會給大家介紹3種不同的實現方法:
- 普通thread實現
- TimerTask實現
- ScheduledExecutorService實現
普通thread
這是最常見的,建立一個thread,然後讓它在while迴圈裡一直執行著,通過sleep方法來達到定時任務的效果。這樣可以快速簡單的實現,程式碼如下:
public class Task1 { public static void main(String[] args) { // run in a second final long timeInterval = 1000; Runnable runnable = new Runnable() { public void run() { while (true) { // ------- code for task to run System.out.println("Hello !!"); // ------- ends here try { Thread.sleep(timeInterval); } catch (InterruptedException e) { e.printStackTrace(); } } } }; Thread thread = new Thread(runnable); thread.start(); } }
用Timer和TimerTask
上面的實現是非常快速簡便的,但它也缺少一些功能。
用Timer和TimerTask的話與上述方法相比有如下好處:
- 當啟動和去取消任務時可以控制
- 第一次執行任務時可以指定你想要的delay時間
在實現時,Timer類可以排程任務,TimerTask則是通過在run()方法裡實現具體任務。
Timer例項可以排程多工,它是執行緒安全的。
當Timer的構造器被呼叫時,它建立了一個執行緒,這個執行緒可以用來排程任務。
下面是程式碼:
import java.util.Timer; import java.util.TimerTask; public class Task2 { public static void main(String[] args) { TimerTask task = new TimerTask() { @Override public void run() { // task to run goes here System.out.println("Hello !!!"); } }; Timer timer = new Timer(); long delay = 0; long intevalPeriod = 1 * 1000; // schedules the task to be run in an interval timer.scheduleAtFixedRate(task, delay, intevalPeriod); } // end of main }
這些類從JDK 1.3開始存在。
ScheduledExecutorService
ScheduledExecutorService是從Java SE 5的java.util.concurrent裡,做為併發工具類被引進的,這是最理想的定時任務實現方式。
相比於上兩個方法,它有以下好處:
- 相比於Timer的單執行緒,它是通過執行緒池的方式來執行任務的
- 可以很靈活的去設定第一次執行任務delay時間
- 提供了良好的約定,以便設定執行的時間間隔
下面是實現程式碼,我們通過ScheduledExecutorService#scheduleAtFixedRate展示這個例子,通過程式碼裡引數的控制,首次執行加了delay時間。
import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class Task3 { public static void main(String[] args) { Runnable runnable = new Runnable() { public void run() { // task to run goes here System.out.println("Hello !!"); } }; ScheduledExecutorService service = Executors .newSingleThreadScheduledExecutor(); service.scheduleAtFixedRate(runnable, 0, 1, TimeUnit.SECONDS); } }
來源:newhottopic
相關文章
- Java如何實現定時任務?Java
- Python實現定時任務的多種方式Python
- java springboot 實現定時器任務JavaSpring Boot定時器
- Spring Boot 實現定時任務的 4 種方式Spring Boot
- 使用Java實現定時任務排程Java
- Java定時任務實現優惠碼Java
- Spring Boot 中實現定時任務的兩種方式Spring Boot
- 玩轉SpringBoot:SpringBoot的幾種定時任務實現方式Spring Boot
- Java 定時任務Java
- SpringBoot如何實現定時任務Spring Boot
- 如何用 Java 實現 Web 應用中的定時任務?JavaWeb
- PHP定時執行任務的實現PHP
- [筆記]laravel定時任務的實現筆記Laravel
- 深入 Java Timer 定時任務排程器實現原理Java
- java web定時任務JavaWeb
- Java & Go 定時任務JavaGo
- linux實現一個定時任務Linux
- 基於redis實現定時任務Redis
- Linux中如何實現定時任務Linux
- 幾種實現延時任務的方式(一)
- Java 中的定時任務(一)Java
- 實戰Spring Boot 2.0系列(六) - 單機定時任務的幾種實現Spring Boot
- Go定時器的三種實現方式Go定時器
- Spring Boot2 系列教程(十六)定時任務的兩種實現方式Spring Boot
- java定時任務巢狀Java巢狀
- java定時任務--Timer、TimerTaskJava
- Java編寫定時任務Java
- Spring Boot入門(三):使用Scheduled註解實現定時任務Spring Boot
- SpringBoot中併發定時任務的實現、動態定時任務的實現(看這一篇就夠了)Spring Boot
- Laravel5.6使用定時任務實現定時發郵件Laravel
- Laravel5.6 使用定時任務實現定時發郵件Laravel
- jenkins設定任務超時⏱(多種方法:圖文並茂?)Jenkins
- Laravel + Workerman 實現多程式定時器任務Laravel定時器
- springboot整合quarzt實現動態定時任務Spring Boot
- Java定時任務解決方案Java
- Java之定時任務全家桶Java
- java Quartz 定時任務管理類Javaquartz
- 使用者自定義定時任務的php實現PHP
- 在dotnet core實現類似crontab的定時任務