elevne's Study Note
Java - ScheduledExecutorService 본문
이전 시간에 알아보았던 것처럼 일정 시간 이후 특정 일을 수행하고자 하거나, 일정 주기를 기준으로 반복하여 특정 일을 수행하고자 할 때에는 ScheduledExecutorService 라는 스레드풀을 사용할 수 있다. 생성하는 방식은 다른 스레드풀과 동일하게, Executors 의 정적메소드로 생성된다. 이 경우에는 newScheduledThreadPool 메소드를 사용한다. (파라미터로는 풀 사이즈를 int 로 넘긴다)
public static void Example1() {
ScheduledExecutorService ses = Executors.newScheduledThreadPool(1);
Runnable task2 = () -> System.out.println("RUNNING TASK2...");
task1();
ses.schedule(task2, 5, TimeUnit.SECONDS);
task3();
ses.shutdown();
}
public static void task1() { System.out.println("RUNNING TASK1..."); }
public static void task3() { System.out.println("RUNNING TASK3..."); }
Runnable 객체를 생성하고, schedule() 메소드에 delay 시간과 함께 파라미터로 넣어준다. 이 때, TimeUnit enum 클래스가 사용된다. 이는 말 그대로 시간의 단위 값을 나타내는 것이다. 위 코드에서는 task2 가 5 초 뒤에 실행되고, task2 는 task3 에 대해 non-blocking 이다.
Runnable 객체 대신에 return 값을 반환하는 Callable 객체를 만들어 사용할 수도 있다. 이 때에는, ses.schedule() 메소드가 ScheduledFuture<?> 타입의 결과를 반환하게 되고, 해당 결과 변수에서 get() 메소드를 호출하여 반환값을 얻어내게 된다.
만약 위와 같이 지연 실행이 아니라 정지적으로 실행하고자 한다면 아래와 같이 코드를 작성한다.
private static int count = 0;
public static void Example2() throws InterruptedException {
ScheduledExecutorService ses = Executors.newScheduledThreadPool(1);
Runnable task1 = () -> {
count++;
System.out.println("RUNNING TASK1: " + count);
};
ScheduledFuture<?> scheduledFuture = ses.scheduleAtFixedRate(task1, 5, 3, TimeUnit.SECONDS);
while (true) {
System.out.println("count: "+count);
Thread.sleep(3000);
if (count == 5) {
System.out.println("Count is 5, cancel the scheduledFuture!");
scheduledFuture.cancel(true);
ses.shutdown();
break;
}
}
}
이 때에는 scheduleAtFixedRate() 메소드가 사용된다. 해당 메소드에는 파라미터로 첫 실행 전 지연 시간, 반복 주기, TimeUnit 값을 task 와 함께 넣어준다. 작업을 취소하고자 할 때에는 .cancle() 메소드를 호출한다.
Reference:
https://mkyong.com/java/java-scheduledexecutorservice-examples/
'Backend > Java' 카테고리의 다른 글
Java - CompletableFuture (0) | 2023.06.15 |
---|---|
Java - NIO (3) (0) | 2023.05.30 |
Java - NIO (2) (0) | 2023.05.29 |
Java - NIO (1) (0) | 2023.05.28 |
Java - Reflection (1) | 2023.05.27 |