반응형
타이머 기본 구조
자바에서는 Timer() 클래스와 TimerTask() 클래스를 이용해서 주기적으로 작업을 진행할 수 있다.
해당 클래스는 JDK 1.3에 새롭게 추가되었다고한다.
Timer() : 실제 타이머의 기능을 수행
TimerTask(): 수행되는 내용을 run() 메소드를 재정의함으로써 실행
import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;
public class Main {
public static void main(String[] args) throws IOException {
Timer t = new Timer();
TimerTask task = new TimerTask() {
public void run() {
System.out.println("Hello World!!");
}
};
t.schedule(task, 2000, 3000); // 2초 후에 3초마다 run() 실행
}
}
타이머 시작 시간 정하기
Calendar는 추상 클래스이므로 인스턴스를 직접 생성할 수 없다. 따라서 getInstance()를 이용해서 인스턴스를 생성하고 반환한다.
set() 메소드를 이용하면 시작 날짜를 직접 설정할 수 있다.
import java.io.IOException;
import java.util.Calendar;
import java.util.Timer;
import java.util.TimerTask;
public class Main {
public static void main(String[] args) throws IOException {
Timer t = new Timer();
TimerTask task = new TimerTask() {
public void run() {
System.out.println("Hello World!!");
}
};
Calendar calendar = Calendar.getInstance();
// 시작 날짜: 2023-06-14 10:17:00
calendar.set(Calendar.YEAR, 2023);
calendar.set(Calendar.MONTH, Calendar.JUNE);
calendar.set(Calendar.DAY_OF_MONTH, 14);
calendar.set(Calendar.HOUR_OF_DAY, 10); // (0-24)
calendar.set(Calendar.MINUTE, 22);
calendar.set(Calendar.SECOND, 0); // 0
calendar.set(Calendar.MILLISECOND, 0);
t.schedule(task, calendar.getTime(), 3000);
}
}
Calendar 클래스에서 주로 사용하는 메소드는 아래와 같다.
메소드 | 설명 |
void add(int field, int amount) | 전달된 Calendar 필드에서 특정 시간 만큼을 더하거나 뺌 |
boolean after(Object when) | 현재 Calendar 인스턴스가 잘 전달된 객체가 나타내는 시간보다 나중인지를 확인함 |
boolean before(Object when) | 현재 Calendar 인스턴스가 잘 전달된 객체가 나타내는 시간보다 앞서는지 확인함 |
void char(int field) | 현재 Calendar 인스턴스의 모든 필드의 값을 undefined로 설정함 |
int get(int field) | 전달된 Calendar 필드에 저장된 값을 반환함 |
static Calendar getInstance() | 시스템의 현재 날짜와 시간으로 Calendar 인스턴스를 생성하여 반환함 |
Data getTime() | 현재 Calendar 인스턴스의 시간 정보를 나타내는 Date 인스턴스를 생성하여 반환함 |
void roll(int field, int amount) | 전달된 Calendar 필드에서 특정 시간 만큼을 더하거나 뺌 |
void set(int field, int value) · · · |
전달된 Calendar 필드를 특정 값으로 설정함 |
scheduleatfixedrate vs schedule
TimerTask() 클래스 run() 메소드에 작성한 작업을 지정한 시간에 수행하려면 scheduleatfixedrate() 혹은 schedule() 메소드를 사용해야한다. 해당 메소드는 각각 2개, 4개의 형태를 가지고 있다.
종류 | 설명 |
scheduleatfixedrate(TimerTask task, Date firstTime, long period) | 지정한 시간부터 일정 간격으로 지정한 작업을 수행 |
scheduleatfixedrate(TimerTask task, long delay, long period) | 일정한 시간이 지난 후에 일정 간격으로 지정한 작업을 수행 |
schedule(TimerTask task, Date time) | 지정한 시간에 지정한 작업을 수행 |
schedule(TimerTask task, Date firstTime, long period) | 지정한 시간부터 일정 간격으로 지정한 작업을 수행 |
schedule(TimerTask task, long delay) | 일정 시간이 지난 후에 지정한 작업을 수행 |
schedult(TimerTaks task, long delay, long period) | 일정 시간이 지난 후에 일정 간격으로 지정한 작업을 수행 |
schedule() 메소드는 fixed-delay 방식으로 진행한다. 선행 작업이 어떠한 이유로 지연될 경우에 다음 수행될 작업이 지연된 시간만큼 늦어진다.
일정한 시간 간격으로 작업을 수행하기 위해서는 scheduleatfixedrate() 메소드를 사용해야한다. 해당 메소드는 fixed-rate 방식으로 진행되며 선행 작업이 어떠한 이유로 지연이 되더라도 지정된 시간에 작업을 수행한다.
따라서, 해당 작업의 중요도에 따라서 scheduleatfixedrate() 혹은 schedule() 메소드를 사용해주면 된다.
반응형