자바 API 3 [Timer]
- Timer 클래스
일정한 시간 간격을 두고 어떠한 일을 수행시키고자 할 때 사용하는 클래스이다.
Timer, TimerTask 클래스
Timer객체는 일정한 시간이 되면 TimerTask 객체가 작동 된다.
단, TimerTask클래스는 추상 클래스이다. 따라서, TimerTask클래스를 상속받는 클래스를 만들어서 사용해야 한다.
import java.util.TimerTask;
public class ExTimerTask1 extends TimerTask{
@Override
public void run(){
System.out.println("ExTimerTask1 : 이곳의 작업이 실행됩니다.");
}
}
import java.util.TimerTask;
public class ExTimerTask2 extends TimerTask{
@Override
public void run(){
System.out.println("ExTimerTask2 : 이곳의 작업이 실행됩니다.");
}
}
다음은 TimerTask를 상속받는 ExTimerTask1 클래스와 ExTimerTask2 클래스이다.
TimerTask 추상클래스를 상속받게되면 꼭 재정의해서 써야하는 run() 메소드가 하나 있는데,
이것은 어떠한 일정 시간이되면, 바로 수행을 하게 될 로직이 들어가는 메소드이다.
import java.util.Timer;
public class TimerEx {
public TimerEx() throws InterruptedException {
System.out.println("^^");
Timer timer = new Timer(true);
TimerTask t1 = new ExTimerTask1(); //JVM(자바가상머신)이 컴파일 시점에 default생성자를 이용해 객체를 생성
TimerTask t2 = new ExTimerTask2();
timer.schedule(t1, 2000); // 2초후 실행
timer.schedule(t2, 10000); // 10초후 실행
Thread.sleep(11000); // 11초 동안 작업을 잠시 중단하고 다음 라인부터 계속 실행
System.out.println("**");
}
}
timer.schedule메소드를 실행할 때, 실행시킬 객체와 시간을 설정해주는데
이때 시간은 천 단위로 초를 입력한다.
Thread.sleep(11000); 을 걸어준 이유는, TimerEx객체가 실행되서 처음부터 수행하는데 로직 자체가 먼저 끝나버리는 것을 방지하기 위해 걸어주었다.
Thread에 대해서는 이후 포스팅에서 자세히 다룰 것이다.
결과는
시작과 동시 "^^" 문자열이 출력되고,
2초 후에 "ExTimerTask1 : 이곳의 작업이 실행됩니다." 문자열이 출력되고,
그로부터 8초후(합이 10초 후)에 "ExTimerTask1 : 이곳의 작업이 실행됩니다." 문자열이 출력되고,
마지막으로 그로부터 1초후(합이 11초 후)에 "**" 문자열이 출력되면서 종료된다.
Timer timer = new Timer(true); 에서 타이머 객체 생성시 "true"를 넣어준 이유는
프로그램이 실행되는 데몬이 모두 끝나면 종료시키기 위해서 넣어준 것으로,
true를 설정해 주지 않으면 로직이 다 끝난 뒤에도 타이머 객체가 계속 메모리에 상주를 하게되는 상황이 발생하게 된다.
깊이 알면 어려우므로 타이머 객체 생성시 true값을 넣어 주어야지만, 로직이 끝났을때 타이머 객체가 함께 종료된다는 것을 알아두면 된다.