여러 종류의 작업을 스케줄링하여 주어진 시간 뒤에 실행하거나 주기적으로 실행할 수 있는 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 |