Bootstrap

Java指定时间执行任务

Timer和TimerTask

有如下好处:

1.当启动和取消任务时可以控制
2.第一次执行任务时可以指定你想要的delay时间

在实现时,Timer类可以调度任务,TimerTask则是通过在run()方法里实现具体任务。
Timer实例可以调度多任务,它是线程安全的。
当Timer的构造器被调用时,它创建了一个线程,这个线程可以用来调度任务。
下面是代码:

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

//用DATE类实现
public class TimedTask1 {

	// 获取应该在多少秒后
	public static long getTaskTime(int shi,int fen) {
		DateFormat sdf = new SimpleDateFormat("HH:mm:ss");

		// 当前时分秒字符串切成数组
		String[] sArr = sdf.format(new Date()).split(":");
		// 从数组取值换算成 秒计数值
		long currentMiao = (Integer.parseInt(sArr[0]) *60*60) + (Integer.parseInt(sArr[1]) *60)
				+ Integer.parseInt(sArr[2]);
		// 设定的执行时间换算成 秒计数值
		long runTime = (shi*60*60 + fen*60);

		if (currentMiao <= runTime) {
			return runTime - currentMiao;
		} else {
			return currentMiao + (24*60*60) - (currentMiao - runTime);
		}
	}

	// 定时任务
	public static void cronJob(int shi,int fen) {
		Timer timer = new Timer();
		timer.schedule(new TimerTask() {
			// 把run方法里的内容换成要运行的代码
			public void run() {
				
				SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
				System.out.println("当前的系统时间为:" + sdf.format(new Date()));
				
			}
		}, getTaskTime(shi,fen) *1000, 24*60*60*1000);
	}

	/*public static void main(String[] args) {
		cronJob(18,30);
	}*/
}

// 用Calendar实现
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class TimedTask2 {
	public static void cronJob(int shi, int fen, int miao) {
		Calendar cal = Calendar.getInstance();
		// 每天定点执行
		cal.set(Calendar.HOUR_OF_DAY, shi);
		cal.set(Calendar.MINUTE, fen);
		cal.set(Calendar.SECOND, miao);

		Timer timer = new Timer();
		timer.schedule(new TimerTask() {

			public void run() {
				// 把run方法里的内容换成你要执行的内容
				SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
				System.out.println("当前的系统时间为:" + sdf.format(new Date()));
			}
		}, cal.getTime(), 24 * 60 * 60 * 1000);
	}

	/*
	 * public static void main(String[] args) { 
	 * cronJob(18, 30, 0); //24小时制 时分秒 
	 * }
	 */
}


java定时任务接口ScheduledExecutorService   

ScheduledExecutorService是从Java SE 5的java.util.concurrent里,做为并发工具类被引进的,这是最理想的定时任务实现方式。

ScheduledExecutorService,是基于线程池设计的定时任务类,每个调度任务都会分配到线程池中的一个线程去执行,也就是说,任务是并发执行,互不影响。

需要注意,只有当调度任务来的时候,ScheduledExecutorService才会真正启动一个线程,其余时间ScheduledExecutorService都是出于轮询任务的状态。

好处:

1.相比于Timer的单线程,它是通过线程池的方式来执行任务的2.可以很灵活的去设定第一次执行任务delay时间3.提供了良好的约定,以便设定执行的时间间隔。

 

下面是代码:

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class TimedTask {
	public static void main(String[] args) {
		Runnable runnable = new Runnable() {
			public void run() {
				// 把run方法里的内容换成你要执行的内容
				SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
				System.out.println("当前的系统时间为:" + sdf.format(new Date()));
			}
		};
		ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
		//public ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit);
		//command--执行的任务,initialDelay--延迟开始,period--间隔时间,unit--时间单位
		service.scheduleAtFixedRate(runnable, 0, 5, TimeUnit.SECONDS);
	}
}


;