cron4j的主要實體是調度程序。使用it.sauronsoftware.cron4j.scheduler實例,您可以在一年中的固定時間執行任務。調度程序可以每分鍾執行一次任務,每五分鍾執行一次,星期五10:00,2月16日12:30,但僅限於星期六,依此類推。可惜沒有設置到秒的操作。
使用cron4j調度程序是一個四步操作:
創建調度程序實例。
安排你的行動。要計划一個操作,您必須告訴調度程序它必須做什么以及何時做。可以指定使用java.lang.runnable或it.sauronsoftware.cron4j.task實例的內容,也可以指定何時使用可以用字符串或it.sauronsoftware.cron4j.scheduling pattern實例表示的計划模式。
官方案例:
import it.sauronsoftware.cron4j.Scheduler; public class Quickstart { public static void main(String[] args) { // Creates a Scheduler instance. Scheduler s = new Scheduler(); // Schedule a once-a-minute task. s.schedule("* * * * *", new Runnable() { public void run() { System.out.println("Another minute ticked away..."); } }); // Starts the scheduler. s.start(); // Will run for ten minutes. try { Thread.sleep(1000L * 60L * 10L); } catch (InterruptedException e) { ; } // Stops the scheduler. s.stop(); } }
其他一些關鍵概念:
您可以計划需要多少任務。
您可以在需要時調度一個任務,也可以在調度程序啟動之后。
也可以在調度程序正在運行時(重新調度操作)更改已調度任務的調度模式。
也可以在計划程序運行時刪除以前計划的任務(取消計划操作)。
您可以啟動和停止一個調度程序多少次。
您可以從一個文件調度。
您可以從任何源進行計划。
您可以向調度程序提供偵聽器,以便接收有關已執行任務的事件。
您可以控制任何正在進行的任務。
您可以手動啟動任務,而不使用計划模式。
您可以更改計划程序工作時區。
在將調度模式與調度程序一起使用之前,可以驗證調度模式。
您可以預測調度模式何時會導致任務執行。
我做了以下調試,執行順序還是需要多動手測試才行。
import com.jiangge.utils.task.TaskRunner; import it.sauronsoftware.cron4j.Scheduler; import it.sauronsoftware.cron4j.Task; import it.sauronsoftware.cron4j.TaskExecutionContext; /** * * @author Uboobo * * 定時任務,目前有兩種框架,一個是corn4j,一個是quartz * * 這里我們分別做下介紹 * * corn4j其本身不支持秒,可以通過修改其源文件重新打包來實現支持,其默認規則如下 * 分:從0到59 * 時:從0到23 * 天:從1到31,字母L可以表示月的最后一天 * 月:從1到12,可以別名:"jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov" and "dec" * 周:從 0 到 6,0 表示周日,6 表示周六,可以使用別名: "sun", "mon", "tue", "wed", "thu", "fri" and "sat" * * 數字 n:表示一個具體的時間點,例如 5 * * * * 表示 5 分這個時間點時執行 * 逗號 , :表示指定多個數值,例如 3,5 * * * * 表示 3 和 5 分這兩個時間點執行 * 減號 -:表示范圍,例如 1-3 * * * * 表示 1 分、2 分再到 3 分這三個時間點執行 * 星號 *:表示每一個時間點,例如 * * * * * 表示每分鍾執行 * 除號 /:表示指定一個值的增加幅度。例如 * /5表示每隔5分鍾執行一次(序列:0:00, 0:05, 0:10, 0:15 等等)。 * 再例如3-18/5 * * * * 是指在從3到18分鍾值這個范圍之中每隔5分鍾執行一次(序列:0:03, 0:08, 0:13, 0:18, 1:03, 1:08 等等)。 * */ public class TimerTask { public static void taskRunner(Object task) { // 創建一個 Scheduler 實例. Scheduler s = new Scheduler(); if (task instanceof Runnable) { System.out.println("Runnable"); s.schedule("*/1 * * * *", (Runnable) task); } else if (task instanceof Task) { System.out.println("task"); s.schedule("*/1 * * * *", (Task) task); } // 自身調度執行一個任務 // s.schedule("*/1 * * * *", new Runnable() // { // public void run() // { // System.out.println("自我調用"); // } // }); s.schedule("*/1 * * * *", new MyTaskrun()); s.schedule("*/1 * * * *", new MyTask()); // Starts the scheduler. s.start(); // Will run for 1 minutes. try { System.out.println("try"); Thread.sleep(1000L * 60L * 1L); } catch (InterruptedException e) { System.out.println(e); } // Stops the scheduler. s.stop(); System.out.println("stop"); } public static void setTask() { // 創建一個 Scheduler 實例.執行多任務 Scheduler s = new Scheduler(); s.schedule("/1 * * * *", new MyTaskrun()); s.schedule("/1 * * * *", new MyTask()); s.start(); try { Thread.sleep(1000L * 60L * 1L); } catch (InterruptedException e) { System.out.println(e); } // Stops the scheduler. //s.stop(); } //通過使用實現接口的方式,定時執行任務 static class MyTaskrun implements Runnable{ public void run() { System.out.println("123"); } } //通過繼承Task的方式,定時執行任務 static class MyTask extends Task{ @Override public void execute(TaskExecutionContext arg0) throws RuntimeException { System.out.println("456"); } } public static void main(String [] args) { /*MyTask myTask = new MyTask(); System.out.println("start"); taskRunner(myTask); System.out.println("next start"); MyTaskrun myTaskrun = new MyTaskrun(); taskRunner(myTaskrun);*/ setTask(); } }