본문 바로가기

Java 공부/신용권의 이것이 자바다

스레드풀(ThreadPool)에서execute()와 submit()의 차이

반응형

병렬작업 처리가 많아지면, 스레드 갯수가 증가하게 되면서 CPU가 바빠져서 메모리 사용량이 증가한다.
이것은 곧 애플리케이션 성능 저하로 이어지게 된다.
갑작스런 병렬 작업의 증가로 인한 스레드폭증을 막기 위해, 스레드풀(ThreadPool)을 사용한다.
스레드풀은 작업처리에 사용되는 스레드의 숫자를 정해 놓고 작업 큐(Queue)에 들어오는 작업들을 하나씩 맡아 처리하는 것을 말한다.
즉, 스레드 갯수를 정해놓고 늘리지 않으면서 작업처리가 끝난 스레드가 다시 작업 큐에서 새로운 작업을 가져와 처리하는 식이다.
그러므로 작업요청이 늘더라도 스레드의 전체 갯수가 늘어나지 않아, 애플리케이션의 성능이 급격히 저하되는 것을 막아준다.


자바는 스레드풀(ThreadPool)을 위해서 java,util.concurrent 패키지에서 ExecutorService 인터페이스와 Executors 클래스를 제공한다.
Executors의 다양한 정적 메소드를 이용해서 ExecutorService 구현객체를 만들 수 있다.
스레드풀(ExecutorService)에서는 작업 처리를 위해 두 가지 메소드가 제공된다.
그것은 execute()와 submit() 메소드이다.


위 코딩은 execute() 메소드를 실행하는 방법을 보여준다.
execute()는 리턴값이 없는 Runnable객체를 작업큐에 저장한다.
그런 만큼 작업처리 결과를 받지 못한다.
무엇보다 중요한 점은 execute()는 작업 처리 도중에 예외가 발생하면 스레드가 종료되고 해당 스레드를 스레드풀에서 제거한 뒤, 다른 작업처리를 위해서 새로운 스레드를 생성한다.
위 콘솔창에서 빨간 글씨의 에러메시지를 확인할 수 있을 것이다.
그리고 스레드갯수를 두 개로 제한했는데, 예외를 발생시키고 종료된 스레드가 제거되면서 5번째 새로운 스레드가 생성되었다는 사실도 알 수 있다.


이에 비해 submit() 메소드는 작업처리결과를 받을 수 있도록 Future를 리턴한다.
무엇보다 중요한 차이첨은 submit()는 작업처리 도중에 예외가 발생하더라도 스레드는 종료되지 않고 다음 작업을 위해 재사용된다.
그렇기 때문에 스레드 생성 오버헤더를 줄이기 위해서 submit()을 사용하는 것이 좋다.
submit() 메소드를 호출했을 경우, 위 콘솔창에서처럼 예외가 발생하더라도 스레드가 종료되지 않고 스레드1과 2가 계속해서 반복 사용되고 있음을 확인할 수 있을 것이다.


반응형