ExecutorService 인터페이스는 스레드의 실행을 관리하고 제어하는 데 도움이 되는 메서드를 추가하여 Executor를 상속합니다. java.util.concurrent 패키지에 정의되어 있습니다. 결과를 반환하는 스레드, 스레드 집합을 실행하고 종료 상태를 결정하는 메서드를 정의합니다. 이 글에서는 execute()와 submit()라는 두 가지 방법의 차이를 살펴보겠습니다.
제목에는 ExecutorService 인터페이스의 execute() 메서드와 submit() 메서드라고 했지만 실제 구조는 아래와 같습니다.
execute() 메서드는 Executor 인터페이스에 정의 되어있습니다.
submit() 메서드는 ExecutorService 인터페이스에 정의되어있고 Executor 인터페이스를 상속받았습니다.
따라서 ExecutorService는 execute() 메서드와 submit() 메서드 모두 호출이 가능합니다.
위의 그림에서 차이점도 찾을 수 있습니다.
- 받을 수 있는 인자 타입에 차이가 있습니다.
- execute() 메서드는 Runnable 인터페이스만 인자로 받을 수 있습니다.
- submit() 메서드는 Runnable 인터페이스와 Callable 인터페이스 모두 인자로 받을 수 있습니다.
- 리턴 타입에 차이가 있습니다.
- execute() 메서드는 반환타입이 void입니다. 즉, 반환 값이 없습니다.
- submit() 메서드는 Future 객체를 반환합니다.
- Future 객체는 비동기 연산의 결과를 의미합니다.
- 따라서 실행결과가 필요할 때 submit() 메서드를 사용할 수 있습니다.
- Future 객체의 get() 메서드를 호출해서 결과를 받아볼 수 있습니다.
- 만약 쓰레드 실행 중 예외가 발생했다면 Future 객체의 get() 메서드를 호출했을 때 해당 예외가 발생합니다.
- execute() 메서드는결과에 대해 신경 쓰지 않고 스레드 풀의 작업자 스레드(Worker Thread)에 의해 코드가 병렬로 실행되기를 원할 때 사용됩니다.
- submit() 메서드는 작업의 결과에 대해 관심이 있을 때 사용할 수 있습니다.
Future 객체의 get() 메서드는 blocking call 이므로 주의해야합니다!
참고자료
'Java' 카테고리의 다른 글
[Java] FFmpeg로 gif파일 mp4로 변환하기 - 2 (0) | 2021.09.30 |
---|---|
[Java] FFmpeg로 gif파일 mp4로 변환하기 - 1 (0) | 2021.09.21 |
[Java] resource 디렉토리의 경로 가져오기 (0) | 2021.08.28 |
[Java] ClassLoader(클래스 로더) (0) | 2021.08.27 |
[Java] ClassNotFoundException VS NoClassDefFoundError (0) | 2021.08.27 |
댓글