zoukankan      html  css  js  c++  java
  • Java实现定时任务的三种方法

      在应用里经常都有用到在后台跑定时任务的需求。举个例子,比如需要在服务后台跑一个定时任务来进行垃圾回收(译者注:个人觉得用定时任务来跑垃圾回收不是很好的例子,从译者接触到的项目来看,比较常见的是用定时任务来进行非实时计算,清除临时数据、文件等)。

      在本文里,我会给大家介绍3种不同的实现方法:

      普通thread实现

      TimerTask实现

      ScheduledExecutorService实现

      普通thread

      这是最常见的,创建一个thread,然后让它在while循环里一直运行着,通过sleep方法来达到定时任务的效果。这样可以快速简单的实现,代码如下:

      publicclass Task1 {

      publicstatic void main(String[] args) {

      // run in a second

      finallong timeInterval = 1000;

      Runnable runnable = newRunnable() {

      publicvoid run() {

      while(true) {

      // ------- code for task to run

      System.out.println("Hello !!");

      // ------- ends here

      try{

      Thread.sleep(timeInterval);

      }catch(InterruptedException e) {

      e.printStackTrace();

      }

      }

      }

      };

      Thread thread = newThread(runnable);

      thread.start();

      }

      }

      用Timer和TimerTask

      上面的实现是非常快速简便的,但它也缺少一些功能。

      用Timer和TimerTask的话与上述方法相比有如下好处:

      当启动和去取消任务时可以控制

      第一次执行任务时可以指定你想要的delay时间

      在实现时,Timer类可以调度任务,TimerTask则是通过在run()方法里实现具体任务。

      Timer实例可以调度多任务,它是线程安全的。

      当Timer的构造器被调用时,它创建了一个线程,这个线程可以用来调度任务。

      下面是代码:

      importjava.util.Timer;

      importjava.util.TimerTask;

      publicclass Task2 {

      publicstatic void main(String[] args) {

      TimerTask task = newTimerTask() {

      @Override

      publicvoid run() {

      // task to run goes here

      System.out.println(http://www.fkit.org);

      }

      };

      Timer timer = newTimer();

      longdelay = 0;

      longintevalPeriod = 1* 1000;

      // schedules the task to be run in an interval

      timer.scheduleAtFixedRate(task, delay,

      intevalPeriod);

      }// end of main

      }

      这些类从JDK 1.3开始存在。

      ScheduledExecutorService

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

      相比于上两个方法,它有以下好处:

      相比于Timer的单线程,它是通过线程池的方式来执行任务的

      可以很灵活的去设定第一次执行任务delay时间

      提供了良好的约定,以便设定执行的时间间隔

      下面是实现代码,我们通过ScheduledExecutorService#scheduleAtFixedRate展示这个例子,通过代码里参数的控制,首次执行加了delay时间。

      importjava.util.concurrent.Executors;

      importjava.util.concurrent.ScheduledExecutorService;

      importjava.util.concurrent.TimeUnit;

      publicclass Task3 {

      publicstatic void main(String[] args) {

      Runnable runnable = newRunnable() {

      publicvoid run() {

      // task to run goes here

      System.out.println("Hello !!");

      }

      };

      ScheduledExecutorService service = Executors

      .newSingleThreadScheduledExecutor();

      service.scheduleAtFixedRate(runnable,0,1, TimeUnit.SECONDS);

      }

      }

     

  • 相关阅读:
    ASP.NET在禁用视图状态的情况下仍然使用ViewState对象【转】
    Atcoder Regular Contest 061 D Card Game for Three(组合数学)
    Solution 「CERC 2016」「洛谷 P3684」机棚障碍
    Solution 「CF 599E」Sandy and Nuts
    Solution 「洛谷 P6021」洪水
    Solution 「ARC 058C」「AT 1975」Iroha and Haiku
    Solution 「POI 2011」「洛谷 P3527」METMeteors
    Solution 「CF 1023F」Mobile Phone Network
    Solution 「SP 6779」GSS7
    Solution 「LOCAL」大括号树
  • 原文地址:https://www.cnblogs.com/gojava/p/3666081.html
Copyright © 2011-2022 走看看