'TimerTask'에 해당되는 글 1건

  1. java.util.Timer의 schedule vs scheduleAtFixedRate (2) 2009/07/01
일정 시간이 지난뒤에 실행을 시켜주는 Utility 클래스로 Java에서는 Timer 클래스가 있습니다.
Timer 클래스를 사용하다 보니, 동일한 기능의 다른 메쏘드(schedule, scheduleAtFixedRate)가 있어서 차이점에 대해서 살펴보았습니다.

Java API에서는 Timer의 schedule과 scheduleAtFixedRate 메쏘드 둘다,
지정한 태스크가 지정한 지연의 후에 시작되어 「고정 빈도 실행」을 반복하도록 스케줄 합니다. 그 후는 지정한 기간과는 별도로 거의 일정한 간격으로 실행됩니다.

Java API의 schedule 메쏘드에 대한 내용은,
고정 지연 실행에서는 전의 실행의 실제의 실행 시간을 기준으로의해 각각의 실행이 스케줄 됩니다. 어떠한 이유로써 실행이 지연 했을 경우 (가비지 컬렉션, 그 외의 백그라운드 작업 등), 그 후의 실행도 지연 됩니다. 최종적으로 실행의 빈도는 보통, 지정한 기간의 대응하는 빈도보다 약간 늦어집니다 (기본이 되는 Object.wait(long)를 지지하고 있는 시스템 클록이 정확이라고 하는 전제로).

Java API의 scheduleAtFixedRate 메쏘드에 대한 내용은,
고정 빈도 실행에서는 최초의 실행의 스케줄 된 실행 시간을 기준으로의해 각각의 실행이 스케줄 됩니다. 어떠한 이유로써 실행이 지연 했을 경우 (가비지 컬렉션 또는 그 외의 백그라운드 작업 등), 「지연을 되찾는다」위해 2개 이상의 실행이 연속해 행해집니다. 최종적으로 실행의 빈도는 지정한 기간의 대응하는 빈도와 같게 됩니다 (기본이 되는 Object.wait(long)를 지지하고 있는 시스템 클록이 정확이라고 하는 전제로).

따라서, 위 내용을 토대로 schedule되는 job의 수행 횟수 또는 비교적 critical한 수행을 해야 되는 경우에는  scheduleAtFixedRate 메쏘드를 사용해야 될것 같습니다.

예제코드
TimerTest.java
import java.util.Timer;
import java.util.TimerTask;

public class TimerTest {

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        Timer timer = new Timer("test");
        timer.schedule(new TimerTask() {
            public void run(){
                try {
                        Thread.sleep(2000);
                        System.out.println("- schedule job run at " + new java.util.Date());
                    } catch(Exception e) {
                        e.printStackTrace();
                    }
                }
            }, 0, 1000 * 1); // 10 초
       
       
        timer.scheduleAtFixedRate(new TimerTask() {
            public void run(){
                try {
                        Thread.sleep(2000);
                        System.out.println("- scheduleatfixedrate run at " + new java.util.Date());
                    } catch(Exception e) {
                        e.printStackTrace();
                    }
                }
            }, 0, 1000 * 1); // 10 초
    }
}

예제화면


그리고, Timer에 schedule된 Task가 중간에 exception이 발생하면, 그 Timer의 모든 task들이 실행이 안 되네요. ^^;;

* reference
- http://rijusnotes.blogspot.com/2009/06/how-to-implement-scheduler-in-java.html
- http://blog.naver.com/saojung50/120050451007