[JAVA] ScheduledExecutorService 인터페이스

여러 종류의 작업을 스케줄링하여 주어진 시간 뒤에 실행하거나 주기적으로 실행할 수 있는 ExecutorService입니다.

실행을 취소하거나 확인할 수 있는 객체를 반환합니다.

Executor의 execute 및 ExecutorService의 submit 메서드는 시간 0으로 요청됩니다. 이 요청은 즉시 실행으로 처리됩니다. schedule 메서드는 절대적인 시간이 아닌 상대적인 시간 및 주기를 파라미터로 받습니다.

Date로 표현된 절대시간을 상대적인 시간으로 변환하는 것은 간단한 일입니다. 

예를 들면 특정 날짜에 schedule 할려면 date.getTime() - System.currentTimeMillis()로 계산하면 됩니다. 

 

ScheduledExecutorService 메서드

  • schedule(Runnable, long, TimeUnit) : long Time만큼 시간이 경과된 후에 일회성 작업을 생성하고 실행합니다. ScheduledFuture 객체를 리턴하여 취소하거나 get()을 이용해서 완료 시 null 리턴이 됩니다.
  • schedule(Callable<V>, long, TimeUnit) : long Time만큼 시간이 경과된 후에 일회성 작업을 생성하고 실행합니다. ScheduledFuture<V>를 리턴하여 취소하거 get()을 이용해서 완료 시 결과를 리턴합니다.
  • scheduleAtFixedRate(Runnable, long, long, TimeUnit) : 2번째 long만큼 지연 후 실행되고 그 후 3번째 long 시간만큼 주기적으로 실행됩니다. 작업의 종료가 늦어지면 끝난 뒤에 바로 실행됩니다.
  • scheduleWithFixedDelay(Runnable, long, long, TimeUnit) : 2번째 long만큼 지연 후 실행되고 그 후 3번째 long 시간만큼 주기적으로 실행됩니다. 작업이 종료가 늦어지면 끝난 뒤에 3번째 long만큼 기다리고 실행됩니다.

schedule 예시

Runnable task = () -> System.out.println(Thread.currentThread().getName());
ScheduledExecutorService ses = Executors.newScheduledThreadPool(1);

ScheduledFuture result = ses.schedule(task, 1, TimeUnit.SECONDS); // 1초 뒤에 실행됩니다.
try {
    System.out.println(result.get()); // 완료 시 null 리턴
} catch (InterruptedException | ExecutionException e) {
    e.printStackTrace();
}
Callable<String> task = () -> "hello";
ScheduledExecutorService ses = Executors.newScheduledThreadPool(1);

ScheduledFuture<String> result = ses.schedule(task, 1, TimeUnit.SECONDS); // 1초 뒤 실행
try {
    System.out.println(result.get()); // hello 리턴
} catch (InterruptedException | ExecutionException e) {
    e.printStackTrace();
}

scheduleAtFixedRate / scheduleWithFixedDelay 예시

Runnable task = () -> {
    try {
        System.out.println(Thread.currentThread().getName());
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
};
ScheduledExecutorService ses = Executors.newScheduledThreadPool(10);

ses.scheduleAtFixedRate(task, 1, 2, TimeUnit.SECONDS); // 1초 뒤 실행 후 2초씩 주기적으로 실행
Runnable task = () -> {
    try {
        System.out.println(Thread.currentThread().getName());
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
};
ScheduledExecutorService ses = Executors.newScheduledThreadPool(10);

ses.scheduleWithFixedDelay(task, 1, 2, TimeUnit.SECONDS);  // 1초 뒤 실행 후 2초씩 주기적으로 실행

scheduleAtFixedRate vs scheduleWithFixedDelay 차이점

scheduleAtFixedRate는 실행 후 2초씩 주기적으로 실행하는데 task의 결과가 10초 뒤에 나오면 바로 실행이 됩니다.(10초 뒤에 실행)

scheduleWithFixedDelay는 실행 후 2초씩 주기적으로 실행하는데 task의 결과가 10초 뒤에 나오면 2초 뒤에 실행이 됩니다.(12초 뒤에 실행)

'JAVA > 스레드' 카테고리의 다른 글

[JAVA] Future 인터페이스  (0) 2023.11.01
[JAVA] Executors 클래스  (0) 2023.10.17
[JAVA] ExecutorService 인터페이스  (1) 2023.10.11
[JAVA] Executor 인터페이스  (0) 2023.10.10
[JAVA] 스레드 풀의 개념과 필요성  (0) 2023.10.06