第一種方法:
/** * 先定義一個任務每天執行的時間點,再寫一個死循環,不斷地拿當前時間和事先定義的時間去比對,若到時間則執行任務 */ @Test public void test1() { String taskTime = "13:43:10"; SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); while (true) { Date date = new Date(); if (sdf.format(date).equals(taskTime)) { System.out.println("任務開始執行!"); try { // 這裡讓線程睡眠一秒鐘的原因是:若任務在1秒內執行完的話,會導致任務執行多遍, // 任務執行完睡眠一秒鐘,保證任務不會重復執行 Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }
第二種方法:若想測試,請一定用main方法,Test不行
/** * 利用ScheduledExecutorService這個接口實現 */ public static void main(String[] args) { Runnable runnable = new Runnable() { @Override public void run() { System.out.println("任務開始執行!"); } }; ScheduledExecutorService sch = Executors.newSingleThreadScheduledExecutor(); // 第一個參數是要執行的線程 // 第二個參數是初始延遲時間 // 第三個參數是任務執行的間隔時間 // 第四個參數是計時單位,可以是時分秒等 sch.scheduleAtFixedRate(runnable, 10, 2, TimeUnit.SECONDS); }
第三種方法:若想測試,請一定用main方法,Test不行
public static void main(String[] args) { TimerTask task = new TimerTask() { @Override public void run() { System.out.println("任務開始執行!"); } }; Calendar cal = Calendar.getInstance(); int year = cal.get(Calendar.YEAR); int month = cal.get(Calendar.MONTH); int day = cal.get(Calendar.DAY_OF_MONTH); cal.set(year, month, day, 14, 1, 0); Date date = cal.getTime(); Timer timer = new Timer(); timer.schedule(task, date, 2000); }