자바에서 지정된 시간에 수행되는 작업 만들기

프로그래밍/JAVA 2013. 9. 24. 22:20

자바에서 지정된 시간에 수행되는 작업 만들기


2013년 10월 11일 3시 25분에 수행되는 작업을 만들기 위해서는 흔히 Cron 과 같은 스케줄링 프로그램을 사용하게 되는데

자바에서는 단순하게 처리가 가능합니다.


우선 해당 프로그램에 대해 생각해 보면 

사용자가 프로그램을 실행하게 되면 지정된 특정 시간, 2013년 10월 11일 3시 25분 에 지정된 작업을 수행합니다.


단순하게 생각하면 무한 루프를 돌면서 현재 시간을 비교해서 지정된 시간이면 작업을 수행하도록 할 수도 있는데

그렇게 하게 되면 무한루프와 비교연산에 리소스 낭비가 발생합니다.


그보다 효율적으로 처리하기 위해서는 Thread를 사용하면 됩니다.

Thread 에 대해 프로그램을 해보신 분이면 아시겠지만

Thread 에는 sleep() 메소드를 통해 해당 프로그램을 지정된 시간동안만 정지하도록 프로그래밍할 수 있습니다.

따라서 프로그램이 시작된 시간부터 지정된 시간까지의 시간 갭을 구해 그 시간 동안 프로그램을 정지 하도록 하면 됩니다.


간단하죠.


public static long timeUntil( int year, int month, int day, int hour, int minute){

Date now = new Date();

Calendar until = Calendar.getInstance();

until.set( Calendar.YEAR, year);

until.set( Calendar.MONTH, month - 1);

until.set( Calendar.DAY_OF_WEEK, day);

until.set( Calendar.HOUR_OF_DAY, hour);

until.set( Calendar.MINUTE, minute);

until.set( Calendar.SECOND, 0);

Date until = until.getTime();

long sleep = until.getTime() - now.getTime();

return sleep;

}


위와 같이 timeUntil 같은 현재 시간과 지정된 시간까지의 시간 차이를 구하는 함수를 만들어 사용하게 되면


sleep( timeUntil( 2013, 10, 11, 3, 25)); // 지정된 시간까지 프로그램 정지 시킴

// 지정된 작업수행

work();


위 코드를 수행하기 위해서는 Thread 로 만들어야 겠죠.


public class FutureWorkThread extends Thread{

private int mYear, mMonth, mDay, mHour, mMinute;

public FutureWorkThread( int year, int month, int day, int hour, int minute){

mYear = year;

mMonth = month;

mDay = day;

mHour = hour;

mMinute = minute;

}

@Override

public void run() {

try {

sleep( timeUntil( mYear, mMonth, mDay, mHour, mMinute));

// 작업을 수행한다.

work();

} catch ( InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

public void work(){

System.out.println( "i'm working!");

}

public long timeUntil( int year, int month, int day, int hour, int minute){

Date now = new Date();

Calendar calUntil = Calendar.getInstance();

calUntil.set( Calendar.YEAR, year);

calUntil.set( Calendar.MONTH, month - 1);

calUntil.set( Calendar.DAY_OF_WEEK, day);

calUntil.set( Calendar.HOUR_OF_DAY, hour);

calUntil.set( Calendar.MINUTE, minute);

calUntil.set( Calendar.SECOND, 0);

Date until = calUntil.getTime();

long sleep = until.getTime() - now.getTime();

return sleep;

}

}


끝.




: