자바 타이머(java.util.Timer)의 schedule vs scheduleAtFixedRate 메서드 차이

자바(Java)에서 일정 시간 간격으로 특정 로직을 실행하는 유틸리티 클래스로 타이머(Timer)가 있다. 이 타이머 클래스에는 동일한 기능을 제공하는 메서드 형태가 두개 있다. 하나는 schedule() 이고 다른 하나는 scheduleAtFixedRate() 이다. 메서드 이름에서 차이를 짐작할 수 있다면 그 내용이 맞을 것이지만 이 차이점에 대해서 한번 살펴보자.

자바 API에서 타이머의 schedule()과 scheduleAtFixedRate()는 둘 다 아래와 같은 설명을 볼 수 있다. 그리고 아래의 설명에서 “거의 일정한 간격”을 주의해 보자.

지정한 태스크가 지정한 지연 뒤에 시작되어 「고정 빈도 실행」을 반복하도록 스케줄 합니다. 그 후는 지정한 기간과는 별도로 거의 일정한 간격으로 실행됩니다.

타이머 클래스의 schedule() 메서드에 대한 설명은 다음과 같다.

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

타이머 클래스의 scheduleAtFixedRate() 메서드에 대한 설명은 다음과 같다.

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

위에서 살펴본 API의 설명을 기반으로 스케줄(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 초
	}
}

예제화면

마지막으로, 타이머에 스케줄된 태스크(Task)가 실행중에 예외(Exception)가 발생하면, 타이머의 모든 태스크가 취소된다.

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

자바 타이머(java.util.Timer)의 schedule vs scheduleAtFixedRate 메서드 차이”에 대한 2개의 생각

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.