ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ExecutorService
    language/Servlet&JSP 2019. 2. 22. 09:23
    반응형

    병렬 작업 처리가 많아지면 스레드 개수가 증가되고 그에 따른 스레드 생성과 스케줄링으로 인해 CPU가 바빠져 메모리 사용량이 늘어납니다. 따라서 어플리케이션의 성능이 저하됩니다.


    갑작스런 병렬작업의 극대화로 인한 스레드 증폭을 막으려면 스레드 풀(Thread Pool)을 사용해야 합니다.


    스레드 풀은 작업 처리에 사용되는 스레드를 제한 된 개수만큼 생성해서 저장해 두는 풀입니다.


    스레드 풀은 작업 처리에 사용되는 스레드를 제한된 개수만큼 정해 놓고 작업 큐(Queue)에 들어오는 작업들을 하나씩 스레드가 맡아 처리합니다.


    작업 처리가 끝난 스레드는 다시 작업 큐에서 새로운 작업을 가져와 처리합니다.


    자바에서는 스레드 풀을 생성하고 사용할 수 있도록 java.util.concurrent 패키지에서 ExecutorService 인터페이스와 Excutors 클래스를 제공합니다. Executors의 다양한 정적 메소드를 이용해서 ExecutorService 구현 객체를 만들 수 있는데, 이것이 바로 스레드 풀입니다.


      newCachedThreadPool() 메소드로 생성된 스레드 풀의 특징은 초기 스레드 수와 코어 스레드 수는 0개이고, 스레드 개수보다 작업 개수가 많으면 새 스레드를 생성시켜 작업을 처리합니다. 이론적으로는 int 값이 가질 수 있는 최대값만큼 스레드가 추가되지만, 운영체제의 성능과 상황에 따라 달라집니다. 1개 이상의 스레드가 추가되었을 경우 60초 동안 추가된 스레드가 아무 작업을 하지 않으면 추가된 스레드를 종료하고 풀에서 제거합니다. 다음은 newCachedThreadPool() 메소드를 호출해서 ExecutorService 객체를 얻는 코드입니다.


    newFixedThreadPool(int nThreads) 메소드로 생성된 스레드 풀의 초기 스레드 개수는 0개이고, 코어 스레드 수는 nThreads입니다. 스레드 개수보다 작업 개수가 많으면 새 스레드를 생성시키고 작업을 처리합니다. 최대 스레드 개수는 파라미터로 준 nThreads 입니다. 이 스레드 풀은 스레드가 작업을 처리하지 않고 놀고 있더라도 스레드 개수가 줄지 않습니다. 다음은 CPU 코어의 수만큼 최대 스레드를 사용하는 스레드 풀을 생성합니다.


    제공하는 서비스의 사용자가 비교적 고정적이라면 FixedThreadPool을 사용해서 고정적으로 스레드를 관리하는 것이 나을 것입니다. 하지만 사용자의 수가 고정적이지 않다면 CachedThreadPool이 더 효율적일 것입니다.

    반응형

    'language > Servlet&JSP' 카테고리의 다른 글

    JSP lifecycle & JSP에서 Servlet으로 변환하기  (0) 2019.03.04
    HTML  (0) 2019.03.04
    세션(Session)  (0) 2019.02.22
    속성, Attribute  (0) 2019.02.22
    ServletContextListener  (0) 2019.02.22
Designed by Tistory.