자바에서 지정된 시간에 수행되는 작업 만들기
프로그래밍/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;
}
}
끝.
'프로그래밍 > JAVA' 카테고리의 다른 글
Apache Common BeanUtils (0) | 2017.07.21 |
---|---|
JSP 에서 변환되는 HTML 의 공백 제거하기 (0) | 2015.01.06 |
자바에서 10진수를 16진수로 변환시 (0) | 2013.09.10 |
Anonymouse 객체에서 this 의 활용 (0) | 2013.09.03 |
자바 정규표현식의 그룹 및 치환 (0) | 2013.08.19 |