1. 程式人生 > >java實現定時任務的幾種常用方法

java實現定時任務的幾種常用方法

/**
 * 普通thread
 * 這是最常見的,建立一個thread,然後讓它在while迴圈裡一直執行著,
 * 通過sleep方法來達到定時任務的效果。這樣可以快速簡單的實現,程式碼如下:
 * @author TGY
 *
 */
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();
	}
}
import java.util.Timer;
import java.util.TimerTask;

/**
 * 
 * 於第一種方式相比,優勢 1>當啟動和去取消任務時可以控制 2>第一次執行任務時可以指定你想要的delay時間
 * 
 * 在實現時,Timer類可以排程任務,TimerTask則是通過在run()方法裡實現具體任務。 Timer例項可以排程多工,它是執行緒安全的。
 * 當Timer的構造器被呼叫時,它建立了一個執行緒,這個執行緒可以用來排程任務。 下面是程式碼:
 * 
 * @author TGY
 * 
 */
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
}

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * 
 * 
 * ScheduledExecutorService是從Java SE5的java.util.concurrent裡,做為併發工具類被引進的,這是最理想的定時任務實現方式。 
 * 相比於上兩個方法,它有以下好處:
 * 1>相比於Timer的單執行緒,它是通過執行緒池的方式來執行任務的 
 * 2>可以很靈活的去設定第一次執行任務delay時間
 * 3>提供了良好的約定,以便設定執行的時間間隔
 * 
 * 下面是實現程式碼,我們通過ScheduledExecutorService#scheduleAtFixedRate展示這個例子,通過程式碼裡引數的控制,首次執行加了delay時間。
 * 
 * 
 * @author TGY
 * 
 */
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, 10, 1, TimeUnit.SECONDS);
	}
}

也可以藉助time類來實現

import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
 
public class TimeTest {
  public static void main(String[] args) {
    timer1();
    //timer2();
    //timer3();
    //timer4();
  }
 
  // 第一種方法:設定指定任務task在指定時間time執行 schedule(TimerTask task, Date time)
  public static void timer1() {
    Timer timer = new Timer();
    timer.schedule(new TimerTask() {
      public void run() {
        System.out.println("-------設定要指定任務--------");
      }
    }, 2000);// 設定指定的時間time,此處為2000毫秒
  }
 
  // 第二種方法:設定指定任務task在指定延遲delay後進行固定延遲peroid的執行
  // schedule(TimerTask task, long delay, long period)
  public static void timer2() {
    Timer timer = new Timer();
    timer.schedule(new TimerTask() {
      public void run() {
        System.out.println("-------設定要指定任務--------");
      }
    }, 1000, 5000);
  }
 
  // 第三種方法:設定指定任務task在指定延遲delay後進行固定頻率peroid的執行。
  // scheduleAtFixedRate(TimerTask task, long delay, long period)
  public static void timer3() {
    Timer timer = new Timer();
    timer.scheduleAtFixedRate(new TimerTask() {
      public void run() {
        System.out.println("-------設定要指定任務--------");
      }
    }, 1000, 2000);
  }
   
  // 第四種方法:安排指定的任務task在指定的時間firstTime開始進行重複的固定速率period執行.
  // Timer.scheduleAtFixedRate(TimerTask task,Date firstTime,long period)
  public static void timer4() {
    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.HOUR_OF_DAY, 12); // 控制時
    calendar.set(Calendar.MINUTE, 0);    // 控制分
    calendar.set(Calendar.SECOND, 0);    // 控制秒
 
    Date time = calendar.getTime();     // 得出執行任務的時間,此處為今天的12:00:00
 
    Timer timer = new Timer();
    timer.scheduleAtFixedRate(new TimerTask() {
      public void run() {
        System.out.println("-------設定要指定任務--------");
      }
    }, time, 1000 * 60 * 60 * 24);// 這裡設定將延時每天固定執行
  }
}