Java Timer 클래스란?
Java의 Timer 클래스는 지정된 시간에 작업(task)을 한 번 실행하거나 반복적으로 실행하도록 예약하는 기능을 제공합니다. 또한 백그라운드에서 데몬(daemon) 스레드로 동작하게 할 수도 있는데, 이 경우 boolean 값을 전달받는 생성자를 사용하면 됩니다.
고정 지연(Fixed Delay)과 고정 속도(Fixed Rate)
Timer는 두 가지 방식으로 작업을 예약할 수 있습니다.
- 고정 지연(fixed delay): 특정 실행이 System GC 등으로 인해 지연되면 이후의 모든 실행도 함께 밀리며, 각 실행은 항상 직전 실행 시점을 기준으로 지연됩니다.
- 고정 속도(fixed rate): 첫 번째 실행 시작 시간을 기준으로 일정한 간격이 유지됩니다. 특정 실행이 System GC 등으로 지연되면 2~3회의 실행이 연달아 수행되면서 원래 간격을 보정합니다.
타이머 취소하기
Timer 클래스는 타이머를 종료할 수 있는 cancel() 메서드를 제공합니다. 이 메서드가 호출되면 해당 Timer는 즉시 중단됩니다. 또한 Timer 클래스는 TimerTask를 상속한 작업 객체만 실행할 수 있다는 점에 유의해야 합니다.
예제 코드
import java.util.*;
public class TimerThreadTest {
public static void main(String []args) {
Task t1 = new Task("Task 1");
Task t2 = new Task("Task 2");
Timer t = new Timer();
t.schedule(t1, 10000); // 10초 후 1회 실행
t.schedule(t2, 1000, 2000); // 1초 후부터 2초마다 반복 실행
}
}
class Task extends TimerTask {
private String name;
public Task(String name) {
this.name = name;
}
public void run() {
System.out.println("[" + new Date() + "] " + name + ": task executed!");
}
}
실행 결과
[Thu Aug 01 21:32:44 IST 2019] Task 2: task executed! [Thu Aug 01 21:32:46 IST 2019] Task 2: task executed! [Thu Aug 01 21:32:48 IST 2019] Task 2: task executed! [Thu Aug 01 21:32:50 IST 2019] Task 2: task executed! [Thu Aug 01 21:32:52 IST 2019] Task 2: task executed! [Thu Aug 01 21:32:53 IST 2019] Task 1: task executed! [Thu Aug 01 21:32:54 IST 2019] Task 2: task executed! [Thu Aug 01 21:32:56 IST 2019] Task 2: task executed! [Thu Aug 01 21:32:58 IST 2019] Task 2: task executed! [Thu Aug 01 21:33:00 IST 2019] Task 2: task executed!
결과 분석
실행 결과를 보면 Task 2는 프로그램 시작 약 1초 후 처음 실행된 뒤 2초 간격으로 계속 반복 실행되고, Task 1은 프로그램 시작 10초 후 딱 한 번만 실행되는 것을 확인할 수 있습니다.
참고: 더 나은 대안, ScheduledExecutorService
Timer 클래스는 내부적으로 단일 스레드로 동작하며, 작업 중 예외가 발생하면 이후 스케줄 전체가 중단될 수 있다는 한계가 있습니다. 그래서 Java 5 이상 환경에서는 스레드 풀을 활용할 수 있는 ScheduledExecutorService 사용이 권장됩니다. 반복 작업, 지정 시간 실행 등 다양한 스케줄링 요구 사항을 더 안정적이고 유연하게 처리할 수 있습니다.