這篇文章將為大家詳細講解有關java中定時任務的實現方法,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
java實現定時功能有多種方式,下面介紹3種:
1、創建一個線程.
import java.util.Date; public class ThreadTest { public static void main(String[] args) { // 設置執行周期 final long timeInterval = 3000; Runnable runnable = new Runnable() { public void run() { while (true) { System.out.println("Task Run ... " + new Date()); try { Thread.sleep(timeInterval); } catch (InterruptedException e) { e.printStackTrace(); } } } }; Thread thread = new Thread(runnable); thread.start(); } }
2、使用 JDK 自帶的 API Timer 以及 TaskTimer。
這種方式和第一種簡單粗暴的方式有什么區別呢,主要體現在使用 API 可以在指定的時間開始啟動任務,可以延期執行首次任務,同樣也看可以設置一定的時間間隔,但是原理是是一樣的,后臺還是啟動了一個線程,應該說是只有一個線程在執行任務,不管我們啟動的 Task 有幾個。所以這也會有問題,比方說一個一個任務沒有執行完成,另一個任務就開始執行了,可能會發生并發問題。還有若是一個任務中報錯,則線程就會被停止。
import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Timer; import java.util.TimerTask; public class MyTask extends TimerTask{ private String name; public MyTask(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public void run() { SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String format = sf.format(new Date()); System.out.println("exec MyTask ... 當前時間為:" + format); System.out.println(this.name +" 正在執行!" + sf.format(new Date())); } public static void main(String[] args) { Timer timer = new Timer(); TimerTask task1 = new MyTask("Tasks 1"); TimerTask task2 = new MyTask("Tasks 2"); Calendar calendar1 = Calendar.getInstance(); calendar1.add(Calendar.SECOND, 3); Calendar calendar2 = Calendar.getInstance(); calendar2.add(Calendar.SECOND, 5); SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String format = sf.format(new Date()); System.out.println("當前時間為:" + format); timer.schedule(task1, calendar1.getTime(), 3000L); timer.schedule(task2, calendar2.getTime(), 3000L); } }
其實在 Timer 中,封裝了一個 Task 的隊列和 Time 的線程對象,我們自定義的 Task 的引用會放在隊列中等待執行。
大致是這么一個關系 Timer - TimerThread - TaskQueue - MyTask - run 當然最終執行的方法肯定是我們自定義任務中的 run 方法。因為我們自定義的任務已經繼承了 TimeTask ,而這個類已經實現了 Runnable 接口。
3、使用ScheduledExecutorService
ScheduledExecutorService是做為并發工具類被引進的,這是最理想的定時任務實現方式。
1.相比于Timer的單線程,它是通過線程池的方式來執行任務的。
2.可以很靈活的去設定第一次執行任務delay時間。
3.提供了良好的約定,以便設定執行的時間間隔。
import java.util.Date; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class qwe { public static void main(String[] args) { //新建定時任務 Runnable runnable = new Runnable() { //run方法中是定時執行的操作 public void run() { System.out.println(new Date()); } }; ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor(); /* * 參數一:command:執行線程 * 參數二:initialDelay:初始化延時 * 參數三:period:兩次開始執行最小間隔時間 * 參數四:unit:計時單位 */ service.scheduleAtFixedRate(runnable, 0, 60, TimeUnit.SECONDS); } }
關于java中定時任務的實現方法就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。