service.scheduleAtFixedRate(runnable,
0
,
30
, TimeUnit.SECONDS);
//0 : 시작 딜레이 (바로 시작하라)
//30 : 3초에 한번 실행
종종 어플리케이션은 백그라운드에서 정해진 시간간격으로 특정한 일을 하고 싶을때가 있습니다. 그때 사용하도록 아래와 같이 3가지 다른 스케쥴링하는 방법을 소개합니다.
1. simple thread
굳이 다른거 공부할필요없이 쓰레드를 직접 만들어서 단순하고 직관적으로 동작하게함.
쓰레드 실행시키고 무한루프 돌면서리 run 내부에 sleep 으로 대기
01.
public
class
Task1 {
02.
public
static
void
main(String[] args) {
03.
04.
final
long
timeInterval =
1000
;
05.
Runnable runnable =
new
Runnable() {
06.
public
void
run() {
07.
while
(
true
) {
08.
// ------- code for task to run
09.
System.out.println(
"Hello !!"
);
10.
// ------- ends here
11.
try
{
12.
Thread.sleep(timeInterval);
13.
}
catch
(InterruptedException e) {
14.
e.printStackTrace();
15.
}
16.
}
17.
}
18.
};
19.
Thread thread =
new
Thread(runnable);
20.
thread.start();
21.
}
22.
}
2. the Timer and TimerTask
1번것은 매우 빠르고 쉬운데 몇가지 기능들이 없어서 불편을 초래할수도있는데 TimerTask 는 아래와 같은 기능을 추가해준다.
스케쥴링이 목적인 Timer class 와 태스크를 감싸는데 사용하는 TimerTask 클래스가 있는데 TimerTask 안에는 실행을 위한 run() 메소드가 있다. Timer 인스턴스는 여러가지 테스크를 실행할수 있으며 thread-safe 하다.
Timer 생성자가 불리워지면 , 하나의 쓰레드를 생성하고 이것은 태스크를 스케쥴링하기위해 사용된다. 여기서는 Timer#scheduleAtFixedRate 를 사용하였다.
01.
import
java.util.Timer;
02.
import
java.util.TimerTask;
03.
public
class
Task2 {
04.
public
static
void
main(String[] args) {
05.
TimerTask task =
new
TimerTask() {
06.
@Override
07.
public
void
run() {
08.
// task to run goes here
09.
System.out.println(
"Hello !!!"
);
10.
}
11.
};
12.
Timer timer =
new
Timer();
13.
long
delay =
0
;
14.
long
intevalPeriod =
1
*
1000
;
15.
// schedules the task to be run in an interval
16.
timer.scheduleAtFixedRate(task, delay,
17.
intevalPeriod);
18.
}
// end of main
19.
}
JDK 1.3 부터 지원됨.
3. ScheduledExecutorService
이것은 Java SE5 의 java.util.concurrent 에서 소개된 유틸인데, 아래와 같은 기능상
이득을 취할수있다.
ScheduledExecutorService#scheduleAtFixedRate 를 사용하였다.
01.
import
java.util.concurrent.Executors;
02.
import
java.util.concurrent.ScheduledExecutorService;
03.
import
java.util.concurrent.TimeUnit;
04.
public
class
Task3 {
05.
public
static
void
main(String[] args) {
06.
Runnable runnable =
new
Runnable() {
07.
public
void
run() {
08.
// task to run goes here
09.
System.out.println(
"Hello !!"
);
10.
}
11.
};
12.
ScheduledExecutorService service = Executors
13.
.newSingleThreadScheduledExecutor();
14.
service.scheduleAtFixedRate(runnable,
0
,
1
, TimeUnit.SECONDS);
15.
}
16.
}
4. scheduleAtFixedRate() / scheduleWithFixedDelay()의 차이
service.scheduleAtFixedRate(runnable,
0
,
30
, TimeUnit.SECONDS);
//0 : 시작 딜레이 (바로 시작하라)
//30 : 3초에 한번 실행