execute()와 submit()은 모두 ExecutorService 인터페이스에서 제공되는 메서드로, 작업을 쓰레드 풀에 제출하여 실행하는 데 사용됩니다. 하지만 두 메서드 간에는 몇 가지 차이점이 있습니다.
execute(Runnable command)
해당 메소드는 Executor 인터페이스 내부에 아래와 같이 정의되어 있습니다.
void execute(Runnable command);
execute 메서드의 특징은 아래와 같습니다.
- Runnable 타입의 작업만 처리 가능합니다.
- 반환 값이 없습니다.
- execute() 메서드는 작업이 완료되면 어떠한 결과값도 반환하지 않습니다. 따라서 Future 객체를 통해 작업의 상태를 추적하거나 결과를 얻을 수 없습니다.
- 작업 실패 시 예외 처리
- 만약 작업이 예외를 던진다면, 해당 예외는 쓰레드 풀에서 직접 처리되어 콘솔에 출력됩니다.
submit(Runnable task) 및 submit(Callable<T> task)
해당 메소드는 Executor 인터페이스를 상속한 ExecutorService 인터페이스 내부에 아래와 같이 여러 형태로 정의되어 있습니다.
<T> Future<T> submit(Callable<T> task);
<T> Future<T> submit(Runnable task, T result);
Future<?> submit(Runnable task);
submit 메서드의 특징은 아래와 같습니다.
- Callable 또는 Runnable 타입의 작업을 처리할 수 있습니다.
- 반환 값이 있는 Future
- submit() 메서드는 Future 객체를 반환하므로 작업의 상태를 추적하거나 작업이 완료될 때 결과를 얻을 수 있습니다.
- 작업 실패 시 예외 처리
- 작업이 실패한 경우 Future 객체의 get() 메서드를 호출할 때 예외가 발생합니다. get() 메서드를 통해 ExecutionException을 더 편리하게 처리할 수 있습니다.
일반적으로 execute()는 간단한 작업을 처리할 때 사용되고, submit()은 작업의 상태를 추적하거나 결과를 얻어야 할 때 사용됩니다. 예외 처리가 필요하거나 반환 값이 있는 경우에는 submit()이 더 편리하게 사용됩니다
execute() 메서드는 Runnable 작업을 쓰레드 풀에 제출하고 결과를 기다리는 메서드가 아니기 때문에, 이 메서드를 사용했을 때는 작업의 완료를 기다리는 직접적인 방법이 없습니다. execute()는 간단한 비동기 실행을 담당하며, 작업이 완료되었는지 여부를 확인하려면 다른 방법을 사용해야 합니다. (예를 들어, execute()로 제출한 작업이 완료되면 ThreadPoolExecutor는 작업이 완료되었음을 알리기 위해 afterExecute 메서드를 호출하여 콜백을 수행할 수 있습니다.)
만약 작업의 완료를 명시적으로 기다려야 한다면 submit() 메서드를 사용하여 Future 객체를 얻어서 get() 메서드를 이용할 수 있습니다.
execute()와 submit()을 사용하여 비동기 작업을 구현한 내용은 아래 포스팅에 작성하였습니다.
결론: 작업 결과를 기다려야 하는 것이 필요한다면, submit()을 사용해서 명시적으로 기다린다는 것을 나타내자.
'Java' 카테고리의 다른 글
[DB] 커넥션 풀이란? (Connection pool) (0) | 2024.08.03 |
---|---|
[Multi-Thread] ThreadPoolExecutor 사용법 및 주의사항 (1) | 2024.01.28 |
[Multi-Thread] Executor, ExecutorService와 ThreadPoolExecutor (0) | 2024.01.27 |
[Multi-Thread] 쓰레드 결과 기다리기 (Future, submit(), get()) (1) | 2024.01.26 |
자바의 직렬화 (Serialization) (0) | 2023.11.10 |