종종 어플리케이션은 백그라운드에서 정해진 시간간격으로 특정한 일을 하고 싶을때가 있습니다. 그때 사용하도록 아래와 같이 3가지 다른 스케쥴링하는 방법을 소개합니다.
- simple thread
- TimerTask
- ScheduledExecutorService
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 run09.System.out.println("Hello !!");10.// ------- ends here11.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.@Override07.public void run() {08.// task to run goes here09.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 interval16.timer.scheduleAtFixedRate(task, delay,17.intevalPeriod);18.} // end of main19.} JDK 1.3 부터 지원됨.
3. ScheduledExecutorService
이것은 Java SE5 의 java.util.concurrent 에서 소개된 유틸인데, 아래와 같은 기능상
이득을 취할수있다.
- Timer 들의 싱글쓰레드와 비교하여 쓰레드풀로서 실행된다.
- 처음 실행시 딜레이를 제공하며 매우 유연하다.
- 타임 인터벌을 제공하기위해 멋진 conventions 을 제공한다.
- 보다 정확한 타임 인터벌 의 태스크 수행
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 here09.System.out.println("Hello !!");10.}11.};12.ScheduledExecutorService service = Executors13..newSingleThreadScheduledExecutor();14.service.scheduleAtFixedRate(runnable, 0, 1, TimeUnit.SECONDS);15.}16.}4. scheduleAtFixedRate() / scheduleWithFixedDelay()의 차이
service.scheduleAtFixedRate(runnable, 0, 30, TimeUnit.SECONDS);
//0 : 시작 딜레이 (바로 시작하라) //30 : 3초에 한번 실행 'Java' 카테고리의 다른 글
| 자바의 런타임 계열 예외와 checked 예외 (0) | 2015.05.15 |
|---|---|
| Java ArrayList 객체 정렬 (0) | 2015.05.14 |
| Java Time/ Date / Calendar example (0) | 2015.05.13 |
| Java Time,Data 클래스의 문제점과 JAVA 8 (0) | 2015.05.13 |
| 자바 List 순회 (0) | 2015.05.12 |