Java實現定時任務的三種方法

在本文裏,我會給你們介紹3種不一樣的實現方法:java

  • 普通thread實現安全

  • TimerTask實現併發

  • ScheduledExecutorService實現ide

普通thread

  這是最多見的,建立一個thread,而後讓它在while循環裏一直運行着,經過sleep方法來達到定時任務的效果。這樣能夠快速簡單的實現,代碼以下:工具

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Task1 {
public static void main(String[] args) {
   // run in a second
   final long timeInterval = 1000 ;
   Runnable runnable = new Runnable() {
   public void 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 = new Thread(runnable);
   thread.start();
   }
}

 用Timer和TimerTask

  上面的實現是很是快速簡便的,但它也缺乏一些功能。spa

  用Timer和TimerTask的話與上述方法相比有以下好處:線程

  • 當啓動和去取消任務時能夠控制code

  • 第一次執行任務時能夠指定你想要的delay時間blog

  在實現時,Timer類能夠調度任務,TimerTask則是經過在run()方法裏實現具體任務。ci

  Timer實例能夠調度多任務,它是線程安全的。

  當Timer的構造器被調用時,它建立了一個線程,這個線程能夠用來調度任務。

  下面是代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java.util.Timer;
import java.util.TimerTask;
public class Task2 {
   public static void main(String[] args) {
     TimerTask task = new TimerTask() {
       @Override
       public void run() {
         // task to run goes here
         System.out.println( "Hello !!!" );
       }
     };
     Timer timer = new Timer();
     long delay = 0 ;
     long intevalPeriod = 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時間。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class Task3 {
   public static void main(String[] args) {
     Runnable runnable = new Runnable() {
       public void run() {
         // task to run goes here
         System.out.println( "Hello !!" );
       }
     };
     ScheduledExecutorService service = Executors
                     .newSingleThreadScheduledExecutor();
     service.scheduleAtFixedRate(runnable, 0 , 1 , TimeUnit.SECONDS);
   }
}

  英文原文:java-how-to-schedule-a-task-to-run-in-an-interval

相關文章
相關標籤/搜索