프로그래밍/JAVA

자바기반 스케줄링 프로그래밍(3) - java.util.Timer

빨강토끼 2014. 11. 11. 15:55

public void java.util.Timer.schedule(TimerTask task, Date firstTime, long period)

Parameters: 

task - 스케줄링 되어 실행될 task. 

firstTime - 실행될  task의 처음시각. 

period - task가 실행될 주기(millisecond). 




output


java.util.Timer 는 단점이 있다.

output 을 보면 0.001~0.002초씩 로그시간이 지연이 발생되는것을 알수있다.


자바의 특성과 다양한 플랫폼에서의 구현때문에, 각각의 JVM에서의 Thread 스케줄링의 구현은 일치하지 않는다.

Task는 Runnable 객체로 구현되어 있고 일정시간동안 sleep상태가 된다. 그러면 Timer가 규정된 순간에 task를 깨운다. 그러나 정확한 실행시간은 JVM 의 스케줄링 정책과 현재 얼마나 많은 Thread가 프로세서를 기다리고 있냐에 따라 달라진다.

Task가 지연되는 경우는 크게 2가지이다.

- 많은 수의 쓰레드가 실행되기를 기다리고 있는 경우

- GC 에 의한 지연

각 Timer 객체는 쓰레드를 백그라운드로 시작한다.

이러한 방식은 J2EE 애플리케이션 서버와 같은 환경에서는 바람직하지 않을 것이다.

왜냐하면 이러한 쓰레드들이 컨테이너 영역 내에 있지 않기 때문이다.



예를 들어 

지금 시간이 오후 2시이고 7시에 맛집에서 식사하려고 한다면,

1.지금부터 5시간후에 맛집에가서 식사를 하겠다고 계획을 세운다.

2.5시간후에 맛집에 도착한다.

3.하지만. 이미 손님들이 줄을 서있어서 기다려서 먹어야한다….


이해하기 쉽게 하기 위하여 예를 든것이므로 혹시 잘못 이해하지 않길 바란다.

그럼 나름 정확한 시간간격으로 실행되거나 특정한 날이나 요일등의 달력기반의 스케줄링을 하려면 
어떻게 해야할까?

다음에 설명할 Quartz를 사용하면 된다.