자바 java.util.Timer는 특정 시간에 스레드를 예약하여 실행할 수 있는 유틸리티 클래스입니다. 자바 타이머 클래스는 한 번 실행되거나 정기적으로 실행되도록 작업을 예약하는 데 사용할 수 있습니다.
자바 타이머태스크
java.util.TimerTask는 Runnable 인터페이스를 구현하는 추상 클래스이며, 이 클래스를 확장하여 우리만의 타이머태스크를 만들어 java Timer 클래스를 사용하여 예약해야 합니다.
자바 타이머 예제
Java Timer 클래스는 스레드 안전하며 여러 스레드가 외부 동기화 없이 하나의 Timer 객체를 공유할 수 있습니다. Timer 클래스는 주어진 규칙적인 간격으로 작업을 추가하기 위해 java.util.TaskQueue를 사용하며 언제든지 TimerTask를 실행하는 데 사용되는 스레드는 하나뿐입니다. 예를 들어, Timer를 10초마다 실행하도록 만들었지만 단일 스레드 실행이 20초 걸린다면 Timer 객체는 계속해서 큐에 작업을 추가하고 하나의 스레드가 완료되면 큐에 알림을 보내고 다른 스레드가 실행을 시작합니다. Java Timer 클래스는 Object wait 및 notify 메서드를 사용하여 작업을 예약합니다. Java Timer 및 TimerTask 예제에 대한 간단한 프로그램은 다음과 같습니다.
package com.journaldev.threads;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class MyTimerTask extends TimerTask {
@Override
public void run() {
System.out.println("Timer task started at:"+new Date());
completeTask();
System.out.println("Timer task finished at:"+new Date());
}
private void completeTask() {
try {
//작업을 완료하는 데 20초가 걸린다고 가정
Thread.sleep(20000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String args[]){
TimerTask timerTask = new MyTimerTask();
//데몬 스레드로 타이머 작업 실행
Timer timer = new Timer(true);
timer.scheduleAtFixedRate(timerTask, 0, 10*1000);
System.out.println("TimerTask started");
//얼마 후에 취소
try {
Thread.sleep(120000);
} catch (InterruptedException e) {
e.printStackTrace();
}
timer.cancel();
System.out.println("TimerTask cancelled");
try {
Thread.sleep(30000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
한 스레드 실행이 20초가 걸리지만 Java Timer 객체는 작업을 매 10초마다 실행하도록 예약되어 있습니다. 프로그램의 출력은 다음과 같습니다:
TimerTask started
Timer task started at:Wed Dec 26 19:16:39 PST 2012
Timer task finished at:Wed Dec 26 19:16:59 PST 2012
Timer task started at:Wed Dec 26 19:16:59 PST 2012
Timer task finished at:Wed Dec 26 19:17:19 PST 2012
Timer task started at:Wed Dec 26 19:17:19 PST 2012
Timer task finished at:Wed Dec 26 19:17:39 PST 2012
Timer task started at:Wed Dec 26 19:17:39 PST 2012
Timer task finished at:Wed Dec 26 19:17:59 PST 2012
Timer task started at:Wed Dec 26 19:17:59 PST 2012
Timer task finished at:Wed Dec 26 19:18:19 PST 2012
Timer task started at:Wed Dec 26 19:18:19 PST 2012
TimerTask cancelled
Timer task finished at:Wed Dec 26 19:18:39 PST 2012
출력 결과는 작업이 이미 실행 중인 경우에는 Timer가 완료될 때까지 기다리고, 완료되면 다음 작업을 큐에서 다시 시작한다는 것을 확인합니다. Java Timer 객체는 연관된 작업을 데몬 스레드로 실행하기 위해 생성할 수 있습니다. Timer의 cancel() 메서드는 타이머를 종료하고 예약된 작업을 모두 삭제하지만, 현재 실행 중인 작업에는 영향을 주지 않고 완료할 수 있도록 합니다. 타이머가 데몬 스레드로 실행되는 경우 취소하든 말든 사용자 스레드가 모두 실행 완료되면 종료됩니다. Timer 클래스에는 주어진 날짜에 한 번 또는 일정한 지연 후에 작업을 예약하는 여러 schedule() 메서드가 있습니다. 일정한 간격으로 작업을 주기적으로 실행하는 여러 scheduleAtFixedRate() 메서드도 있습니다. Timer를 사용하여 작업을 예약할 때는 일반 스레드 실행시간보다 시간 간격이 더 길도록 해야하며, 그렇지 않으면 작업 큐 크기가 계속 증가하여 결국 작업이 계속 실행될 수 있습니다. Java Timer 및 Java TimerTask에 대한 간단한 정리였습니다.
Source:
https://www.digitalocean.com/community/tutorials/java-timer-timertask-example