728x90
반응형

참고 : http://kamkami.tistory.com/30

         http://www.sjava.net/122

         http://blog.naver.com/minis24?Redirect=Log&logNo=80105613414

        

 

자바에서 스케줄링을 사용하기 위해서는 Timer와 TimerTask를 사용하면 된다.

매주 특정일 마다 실행, 매달 말일에 실행 등 특별한 스케줄링을 하고 싶다면 Quartz를 사용하면 된다.

Quartz 경로는 http://www.opensymphony.com/ 에 들어가서 좌측메뉴 Quartz를 클릭한다.

 

 

사용법

GregorianCalendar cal = new GregorianCalendar();

t.schedule(new TestJDKTimer(), 2000);                   //OneOff(딜레이 2초후 1회실행)
  
cal.set(2010,Calendar.APRIL,14);
t.schedule(new TestJDKTimer(), cal.getTime());      //OneOff(주어진 시간에 1회 실행)

  

//고정지연 (2초후 실행하며,마지막 성공 시점부터 지연시간 1초마다 실행)
t.schedule(new TestJDKTimer(), 2000, 1000);

 

//고정지연 (주어진 시간에 실행하며,마지막 성공 시점부터 지연시간 1초마다 실행)         
t.schedule(new TestJDKTimer(), cal.getTime(), 1000);  

 

//고정비율 (2초후 실행하며, 최초 실행 시간으로 부터 1초마다 실행함)

t.scheduleAtFixedRate(new TestJDKTimer(), 2000, 1000);   
 

// 매년 생일마다 실행 (생일은 4월 14일로 설정)
long MillisInYear = 365 * 24 * 60 * 60 * 1000;
t.scheduleAtFixedRate(new TestJDKTimer(),cal.getTime(),MillisInYear );

   

 

Timer 클래스를 사용하다 보니, 동일한 기능의 다른 메쏘드(schedule, scheduleAtFixedRate)가 있어서 차이점에 대해서 살펴보았습니다.

Java API에서는 Timer의 schedule과 scheduleAtFixedRate 메쏘드 둘다, 지정한 태스크가 지정한 지연의 후에 시작되어

「고정 빈도 실행」을 반복하도록 스케줄 합니다. 그 후는 지정한 기간과는 별도로 거의 일정한 간격으로 실행됩니다.

 

Java API의 schedule 메쏘드에 대한 내용은,

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

 


Java API의 scheduleAtFixedRate 메쏘드에 대한 내용은,


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


따라서, 위 내용을 토대로 schedule되는 job의 수행 횟수 또는 비교적 critical한 수행을 해야 되는 경우에는  scheduleAtFixedRate 메쏘드를 사용해야 될것 같습니다.

 

 


샘플

import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class TestTimer {

 Timer timer = null;
 HelloTask task = null;
 
 public TestTimer() {
  timer = new Timer();
  HelloTask task = new HelloTask();
  timer.schedule(task, new Date(), 1000);
 }
 
 public synchronized void stop() {
  if(timer != null)
   timer.cancel();
 }
 
 public synchronized void start() throws Exception {
  timer = new Timer();
  if(task == null)
   task = new HelloTask();
  
  timer.schedule(task, 0, 1000);
 }
 
 class HelloTask extends TimerTask {
  public void run() {
   System.out.println(new Date());
  }
 }
 
 public static void main(String[] args) {
  try {
   TestTimer t = new TestTimer();
   Thread.sleep(3000);
   t.stop();
   Thread.sleep(2000);
   t.start();
  } catch (Exception e) {
   e.printStackTrace();
  }
  
 }
 
}

728x90
반응형
블로그 이미지

nineDeveloper

안녕하세요 현직 개발자 입니다 ~ 빠르게 변화하는 세상에 뒤쳐지지 않도록 우리모두 열심히 공부합시다 ~! 개발공부는 넘나 재미있는 것~!

,