今天工作的过程中,利用线程的框架编写一个后台定时任务,执行一些操作,突然我就在想java中实现定时任务的方式有哪些呢,于是在下班后自己搜了一些资料,试着写了一个定时任务,特此在这些个笔记,让自己加深一下印象,证明自己也曾经学过java定时器的实现。
java实现定时有三种方法:
- 利用单线程,通过线程的睡眠,来达到定时效果。
- 通过java提供的Timer and TimerTask类来实现。Timer和TimerTask是rt.jar包下java.util.TimerTask;和java.util.Timer两个类。
- 通过ScheduledExecutorService工具类实现,这是最好的实现方式。
下面我们就来详细的介绍上面这三种实现定时任务的方式:
利用单线程来实现,那么我们就要创建一个线程,在线程通过Sleep()函数来实现定时的效果,这种实现方式比较死板。但是不能达到很好的定时效果。
Runnable task = new Runnable() {
@Override
public void run() {
while(true){
Sleep(60);
//TODO 你想做的事情
}
}
}
利用Timer和TimerTask实现,相比较单线程实现定时任务,这种实现方式有以下的有点:
- 可以控制启动和取消任务
- 第一次执行任务时候可以指定你想要的delay时间
- Timer可以调度任务,TimerTask可以通过run实现具体的任务,Timer可以调度多任务,他是线程安全的,当Timer被创建的时候他创建一个线程,这个线程可以用来调度任务。
- timer.scheduleAtFixedRate(TimerTask,delay,period); delay 程序启动间隔时间,period是下次运行间隔时间。timer.scheduleAtFixedRate(TimerTask,date,period); date启动时间
- schedule在计算下一次执行的时间的时候,随后的执行时间按照 上一次 **实际执行完成的时间点** 进行计算
- scheduleAtFixedRate方法:随后的执行时间按照 上一次开始的 时间点 进行计算
public class Task2 {
4. public static void main(String[] args) {
5. TimerTask task = new TimerTask() {
6. @Override
7. public void run() {
8. System.out.println("Hello !!!");
9. }
10. };
11. Timer timer = new Timer();
12. long delay = 0;
13. long intevalPeriod = 1 * 1000;
14. timer.scheduleAtFixedRate(task, delay,intevalPeriod);
15. }
16.}
ScheduledExecutorService 是java作为并发工具类引用的,这是理想的定时任务实现方式相比较前两个方法,他的好处:相比较Timer的单线程,那么ScheduledExcecutorServce是通过线程池的方式来执行任务的。可以灵活的去设定第一次执行任务的delay时间,提供了良好的约定,以便设定执行的时间间隔
public class Task3 {
5. public static void main(String[] args) {
6. Runnable runnable = new Runnable() {
7. public void run() {
8. System.out.println("Hello !!");
9. }
10. };
11. ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
12. service.scheduleAtFixedRate(runnable, 0, 1, TimeUnit.SECONDS);
13. }
14.}
以上就是三种定时器的实现方式,当然,这只是定时器的启动方式,如果你想在通过定时器实现更多的功能,那就要和其他的模块进行组装和搭建