使用Java自動化執行工作 - Timer 和 ScheduledExecutorService

在Java中,如果想要在給定的時間區隔或固定時間執行某些任務,有幾種方法,在這裡稍微做個筆記。



1. 使用Timer + TimerTask
在主程式中,Timer會使用schedule方法來安排想要執行的工作和執行的時間區隔,而需要被執行的工作(類別)只需要去繼承TimerTask類別,同時覆寫run方法即可。

TimerTask是想要被執行的工作類別,繼承TimerTask類別,同時將想要被執行的工作寫在run方法中:
 import java.util.Date;
import java.util.TimerTask;

public class TimeTask extends TimerTask{

    @Override
    public void run() {
        System.out.println("my job : " + new Date());
    }
}


而在主程式中,則是利用Timer類別的schedule方法來安排執行時間區隔:

import java.util.Timer;

public class TimerTest{

    public static void main(String [] args) {
        Timer timer = new Timer();
        long delayTime = 1 * 1000;
        long period = 2 * 1000;
        timer.schedule(new TimeTask(), delayTime, period);
    }
}


在schedule方法中給定三個參數第一個代表欲執行的工作,第二個參數代表在第一次執行工作前先延遲多久時間,第三個參數代表每間隔多少時間執行一次工作。

2. 使用ScheduledExecutorService

上面的Timer方法的一個缺點就是它是以Single Thread的方式來處理任務,如果你需要數個執行緒來同時執行不同任務時,Timer就不是這麼適合,這時候Java提供另外一種類別 - ScheduledExecutorService。

public class MyJob implements Runnable{

    private String jobName = "";
   
    MyJob(String name) {
        this.jobName = name;
    }
   
    @Override
    public void run() {       
        System.out.println(jobName);
    }
}


import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class ScheduledExecutorTest {
   
    public static void main(String [] args) {
        ScheduledExecutorService service = Executors.newScheduledThreadPool(2);
        service.scheduleAtFixedRate(new MyJob("job1"), 1, 1, TimeUnit.SECONDS);
        service.scheduleAtFixedRate(new MyJob("job2"), 1, 1, TimeUnit.SECONDS);
    }
}


在上面的例子中,在我們想要被執行的任務類別(MyJob)中,去實作Runnable介面,將任務放在Run方法中。主程式當中, 我們利用newScheduledThreadPool方法來建立ThreadPool,並把它指派給ScheduledExecutorService的instance,最後利用scheduleAtFixedRate方法,傳入四個參數,分別是:欲執行的類別、第一次執行前要delay的時間、每次執行的時間間隔、時間單位。

要特別注意的是,想要被ScheduleAtFixRate方法所呼叫的欲執行類別都必須要實作Runnable介面。這一點可以由 ScheduledExecutorService的API中得知。

Share this post!

Bookmark and Share

1 意見:

become 提到...

可以考慮Quartz,以前我們都是用Spring+Quartz