개발 & 데이터베이스/JAVA

자바 타이머 기본 구조와 시작 시간 정하기 (scheduleatfixedrate, schedule)

K.두부 2023. 6. 14. 17:30
반응형

타이머 기본 구조

자바에서는 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() 메소드를 사용해주면 된다.

반응형