实现java定时任务
本文中Java定时任务一共有三种,分别是利用Thread类中sleep()方法,Timer与TimerTask类以及ScheduledExecutorService接口来实现延时以及定时任务。
一.<!--[endif]-->类
这是最简单的一种方法,通过创建一个Thread类,让其一直在while循环中执行,并通过sleep方法延时一段时间便可以达到定时任务的目的。
简单代码如下:
- package?pzw.TimedTask;??
- ??
- public?class?Maintest?extends?Thread{??
- ??????
- ????private?final?int?interval?=?1000;??
- ??????
- ????public?static?void?main(String[]?args){??
- ????????Maintest?mt?=?new?Maintest();??
- ????????mt.start();??
- ??????????
- ????}??
- ??????
- ????public?void?run(){??
- ????????while(true){??
- ????????????try?{??
- ????????????????sleep(interval);??
- ????????????}?catch?(InterruptedException?e)?{??
- ????????????????e.printStackTrace();??
- ????????????}??
- ????????????System.out.println("定时任务已执行!!");??
- ????????}??
- ????}??
- ??????
- }??
而这种方法的缺点也是显而易见的,由于sleep()方法本身的缺陷,导致定时可能会不大精确,同时不方便用户修改启动的delay时间,而且启动与停止任务并不方便控制。
二.Timer类与TimerTask类
该方法通过使用Timer类来启动任务,TimerTask类通过run方法来实现具体的定时任务内容。
这种方法虽然没有之前那种那么简单快速,但明显也多了很多有用的功能,在实现时,Timer类用于调度任务,功能是在指定的时间间隔内反复触发指定窗口的定时器事件,而TimerTask类用于创建一个新线程,执行具体任务。
- public?static?void?main(String[]?args){??
- //??????Maintest?mt?=?new?Maintest();??
- //??????mt.start();??
- ????????TimerTask?tt?=?new?TimerTask(){??
- ????????????public?void?run(){??
- ????????????????//具体任务的操作??
- ????????????????System.out.println("定时任务");??
- ????????????}??
- ????????};??
- ????????Timer?time?=?new?Timer();??
- ????????long?delay?=?0;??
- ????????long?period?=?1*1000;??
- ????????time.scheduleAtFixedRate(tt,?delay,?period);??
- }??
?
上面即是使用Timer类与TimerTask类来实现Java定时任务,这种方法的比直接在一个线程中使用sleep()方法无疑功能多了很多,例如,可以控制启动与任务的停止,其次还可以指定任务延时启动。但是由于Timer类使用过的是单线程,在处理需要多个线程同时使用者,有着明显的不足之处,因此,我们可以使用第三种方法ScheduledExecutorService接口。
三.ScheduledExecutorService接口
根据我查的资料,ScheduledExecutorService接口是从Java?SE?5的java.util.concurrent里,做为并发工具类被引进的,这是最理想的定时任务实现方式。而相较于之前的几种方法,这种方法使用的不是单线程的方法,而是通过使用线程池来执行任务的,那么线程池是什么呢?线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。那么使用线程池的优点有哪些?
1、可以优化资源的使用效率,提高其性能;
2、可以完成需要大量线程的任务;
3、对性能要求苛刻的应用;
4、接受突发性的大量请求,但不至于使服务器因此产生大量线程的应用。
?
示例:
- Runnable?run?=?new?Runnable(){??
- ????????????public?void?run()?{??
- ????????????????System.out.println("每隔一秒钟输出一次!!!");??
- ????????????}??
- ??????????????
- ????????};??
- ????????//安排延时任务??
- ????????ScheduledExecutorService?service?=?Executors.newSingleThreadScheduledExecutor();??
- ????????service.scheduleAtFixedRate(run,?0,?1,?TimeUnit.SECONDS);?
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。