(一)java代码中定时调用的三种方法:
方法一:使用thread
创建一个thread,然后让它在while循环里一直运行着,通过sleep方法来达到定时任务的效果。代码如下:
- public static void main(String[] args) {
- final long timeInterval = 1000;
- Runnable runnable = new Runnable() {
- public void run() {
- while (true) {
- System.out.println("方法一:循环调用 !! 时间=" + new Date() );
- try {
- Thread.sleep(timeInterval);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- };
- Thread thread = new Thread(runnable);
- thread.start();
- }
方法二:在实现时,Timer类可以调度任务,TimerTask则是通过在run()方法里实现具体任务。 Timer实例可以调度多任务,它是线程安全的。
当Timer的构造器被调用时,它创建了一个线程,这个线程可以用来调度任务。
详解Timer地址,可查看调用时间 http://blog.csdn.net/chenssy/article/details/32703499
下面是简单代码:
- public static void main(String[] args) {
- TimerTask task = new TimerTask() {
- @Override
- public void run() {
- System.out.println("方法二:Timer定时调用 !!! 时间=" + new Date() );
- }
- };
- Timer timer = new Timer();
- long delay = 10000;
- long intevalPeriod = 1 * 1000;
- timer.scheduleAtFixedRate(task, delay, intevalPeriod);
- }
方法三:ScheduledExecutorService是从Java SE5的java.util.concurrent里,做为并发工具类被引进的,这是最理想的定时任务实现方式。ScheduledThreadPoolExecutor可以说是Timer的多线程实现版本,连JDK官方都推荐使用。
可以参考查看 http://blog.csdn.net/guozebo/article/details/51090612
下面是简单代码:
- public static void main(String[] args) {
- Runnable runnable = new Runnable() {
- public void run() {
- System.out.println("方法三:ScheduledExecutorService定时调用 !! 时间=" + new Date() );
- }
- };
- ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
- // 第二个参数为首次执行的延时时间,第三个参数为定时执行的间隔时间
- service.scheduleAtFixedRate(runnable, 5, 3, TimeUnit.SECONDS);
- }
(二)java代码定时调用在spring中的例子:(下面代码为固定几分钟调用一次,百度文库定时调用http://wenku.baidu.com/view/a8ac2b71a8114431b80dd809.html)
编写类TimerManager:
- public class TimerManager {
- public TimerManager() {
- NFDFlightDataTimerTask task = new NFDFlightDataTimerTask();
- ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
- // 第二个参数为首次执行的延时时间,第三个参数为定时执行的间隔时间
- service.scheduleAtFixedRate(task, 5, 3, TimeUnit.SECONDS);
- }
- }
- public class NFDFlightDataTimerTask extends TimerTask{
- private static Logger log = Logger.getLogger(NFDFlightDataTimerTask.class);
- @Override
- public void run() {
- try {
- //在这里写你要执行的内容
- System.out.println("执行定时调用 !! 时间=" + new Date() );
- } catch (Exception e) {
- log.info("-------------解析信息发生异常--------------");
- }
- }
- }
编写类NFDFlightDataTaskListener:
- public class NFDFlightDataTaskListener implements ServletContextListener {
- public void contextInitialized(ServletContextEvent event) {
- new TimerManager();
- }
- public void contextDestroyed(ServletContextEvent event) {
- }
- }
web.xml
- <listener>
- <listener-class>com.cxy.timer.NFDFlightDataTaskListener</listener-class>
- </listener>