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);
}
}