- 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값을 넣어 주어야지만, 로직이 끝났을때 타이머 객체가 함께 종료된다는 것을 알아두면 된다.

 

 

 

+ Recent posts