다른 유형의 작업 풀은 예약된 작업 풀입니다. 이름으로 판단하면 이 유형을 사용하여 특정 작업을 시작해야 하는 시기를 예약한다고 가정할 수 있습니다.

이 유형의 서비스는 일정 시간이 경과한 후 활동을 시작하는 작업이 있거나 반복 작업을 예약하려는 경우에 유용합니다.

하나를 사용하려면 Executors.newScheduledThreadPool(1) 을 호출합니다 .

나중에 매개 변수에 대해 이야기하겠습니다. 그러나 지금 우리가 알아야 할 것은 이 메서드가 호출될 때 ScheduledExecutorService 객체를 얻는다는 것입니다.

ScheduledExecutorService 는 ExecutorService를 확장하는 인터페이스입니다.

이 인터페이스에는 다음 메서드가 나타납니다.

방법 설명

ScheduledFuture<?>
schedule(Runnable command,
                                  long delay, TimeUnit unit);
지정된 지연 후에 실행되는 일회성 작업을 만들고 실행합니다.

<V> ScheduledFuture<V>
schedule(Callable<V> callable,
                                      long delay, TimeUnit unit);
생성 및 실행예정된 미래지정된 지연 후에 실행되는 개체입니다.

ScheduledFuture<?>
scheduleAtFixedRate(Runnable command,
                                             long initialDelay,
                                             long period,
                                             TimeUnit unit);
지정된 초기 지연 후 먼저 실행된 다음 지정된 기간 후에 다시 실행되는 반복 작업을 만들고 실행합니다. 즉, 실행은 initialDelay 다음 에 initialDelay + period , initialDelay + 2 * period 등으로 시작됩니다.

ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,
                                                long initialDelay,
                                                long delay,
                                                TimeUnit unit);
지정된 초기 지연 후 먼저 실행된 다음 한 실행 완료와 다음 실행 시작 사이의 지정된 지연으로 다시 실행되는 반복 작업을 만들고 실행합니다.

따라서 인터페이스를 통해 일정한 간격으로 또는 약간의 지연 후에 작업을 실행할 수 있습니다.

newScheduledThreadPool 메서드에 대해 자세히 알아보세요.

여러 가지 방법으로 호출할 수 있습니다.


newScheduledThreadPool(int corePoolSize)
corePoolSize는 유휴 상태인 경우에도 풀에 유지할 스레드 수입니다.

newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory)

corePoolSize는 유휴 상태인 경우에도 풀에 유지할 스레드 수입니다.

threadFactory 는 새 스레드를 만들 때 사용할 팩터리입니다.

두 방법 모두 지정된 지연 후 또는 주기적으로 실행할 작업을 예약할 수 있는 스레드 풀을 만듭니다.

ScheduledThreadPool이 어떻게 작동하는지 보기 위해 예제를 살펴보겠습니다 .

예를 들어 5초마다 이메일을 확인하는 작업이 있지만 이 확인이 기본 프로그램에 영향을 주어서는 안 되며 추가 리소스의 잠재적인 소비를 수반한다고 가정합니다.

이메일 확인을 시뮬레이트하는 작업 클래스가 있습니다.


public class Task implements Runnable {
   @Override
   public void run() {
       System.out.println("Checking email...");
   }
}

다음으로 스레드 풀을 만들고 확인을 예약합니다.


ScheduledExecutorService executorService = Executors.newScheduledThreadPool(2);
executorService.scheduleAtFixedRate(new Task(), 0, 5, TimeUnit.SECONDS);

출력에서 5초마다 다음이 표시됩니다.

이메일 확인 중...

일반적으로 이러한 풀을 사용하여 예에서와 같이 주기적인 "하우스키핑" 작업을 수행할 수 있습니다. 하우스키핑 작업은 주 프로그램이 수행하는 작업과 관계없이 수행되어야 하는 작업입니다.