Java 스레드 풀 개념 요약(스레드 풀)

1. 풀링 사상의 적용

풀링 아이디어는 일반적인 소프트웨어 설계 및 최적화 기술입니다. 다음은 아이디어 풀링의 몇 가지 일반적인 적용 시나리오입니다.

  1. 스레드 풀: 스레드 풀은 풀링 아이디어의 일반적인 응용 프로그램입니다. 스레드를 재사용하면 스레드 생성 및 삭제에 따른 오버헤드가 줄어들고 스레드 집합을 미리 생성하여 준비 상태로 전환함으로써 시스템 성능과 응답성이 향상됩니다.

  2. 연결 풀: 연결 풀은 데이터베이스 및 네트워크 프로그래밍의 일반적인 응용 프로그램입니다. 데이터베이스 연결이나 네트워크 연결을 미리 일괄적으로 생성하고 재사용 가능한 상태로 만들어 연결의 잦은 생성 및 해제를 방지함으로써 데이터베이스 액세스 및 네트워크 통신의 효율성을 향상시킵니다.

  3. 개체 풀: 개체 풀은 재사용 가능한 개체를 관리하고 재사용하는 데 사용됩니다. 예를 들어 데이터베이스 연결 풀, 스레드로부터 안전한 캐시 풀 등이 있습니다. 개체 풀을 통해 잦은 개체 생성과 소멸을 방지하고 시스템 성능과 리소스 활용도를 향상시킬 수 있습니다.

  4. 메모리 풀: 빈번한 메모리 할당 및 해제는 메모리 조각화를 유발하고 메모리 활용 효율성을 감소시킬 수 있습니다. 메모리 풀은 연속된 메모리 공간을 고정된 크기의 블록으로 나누고 사용 가능한 블록 목록을 유지합니다. 프로그램은 메모리 조각화를 줄이고 메모리 할당 성능을 향상시키기 위해 메모리 풀에서 메모리 블록을 적용하고 해제할 수 있습니다.

  5. 문자열 풀: 문자열 풀은 풀에서 동일한 문자열을 공유하여 메모리 사용량을 줄이고 문자열 비교 속도를 높입니다. Java의 문자열 상수 풀은 일반적인 문자열 풀 애플리케이션입니다.

        이러한 풀링 아이디어의 적용은 시스템 성능, 리소스 활용도 및 개발 효율성을 향상시키고 객체의 반복적인 생성 및 파괴를 방지하여 시스템 오버헤드를 줄이고 더 나은 사용자 경험을 제공하는 것을 목표로 합니다.

둘째, 스레드 풀의 작동 원리

스레드 풀의 작동 원리는 기본적으로 다음 단계로 나눌 수 있습니다.

  1. 스레드 풀 초기화: 스레드 풀 관리자를 만들고 스레드 수, 작업 대기열 크기 등을 포함한 스레드 풀 매개변수를 설정합니다.

  2. 스레드 생성: 스레드 풀의 초기 구성을 기반으로 지정된 수의 스레드를 생성하고 작업 실행을 기다리는 준비 상태로 전환합니다.

  3. 작업 수신: 실행해야 할 작업이 있으면 스레드 풀이 이를 수신하고 처리를 위해 대기열에 넣습니다. 태스크는 Runnable 인터페이스 또는 Callable 인터페이스를 구현하는 객체일 수 있습니다.

  4. 작업 예약: 스레드 풀의 스레드는 작업 대기열에서 작업을 가져오고 FIFO(선입선출), LRU(최근 사용) 등과 같은 미리 설정된 예약 전략에 따라 작업을 선택합니다.

  5. 작업 실행: 선택한 스레드는 작업 대기열에서 작업을 꺼내고 작업의 run() 또는 call() 메서드를 실행합니다. 작업이 실행된 후 스레드는 유휴 상태로 들어가고 다음 작업을 기다립니다.

  6. 스레드 재활용: 스레드 풀이 일정 기간 동안 유휴 상태일 때 관리자는 시스템 리소스를 절약하기 위해 일부 스레드를 파괴하기로 결정할 수 있습니다. 스레드가 삭제된 후에는 스레드 풀의 스레드 수가 그에 따라 줄어듭니다.

  7. 오류 처리: 스레드 풀은 작업 실행 중에 생성된 예외를 캡처하여 포착되지 않은 예외로 인해 스레드가 충돌하는 것을 방지합니다. 재실행, 로깅, 무시 등과 같은 특정 요구 사항에 따라 예외 처리 전략을 사용자 정의할 수 있습니다.

        위의 작동 원리를 통해 스레드 풀은 스레드 재사용과 리소스의 합리적인 활용을 실현하여 시스템이 동시 작업을 더 잘 처리하고 성능과 응답 속도를 향상시킬 수 있습니다. 동시에 스레드 풀은 스레드 수를 제어하여 너무 많은 스레드로 인한 리소스 소비 및 성능 저하를 방지하고 스레드 관리 메커니즘을 제공할 수도 있습니다.

3. 스레드 풀에 대한 이해를 간략하게 설명해주세요.

       이 질문을 받으면 스레드 풀의 사용 방법, 스레드 풀의 이점, 스레드 풀의 시작 전략을 확장할 수 있습니다. 스레드 풀을 올바르게 사용하면 세 가지 이점을 얻을 수 있습니다.
        첫째, 자원 소비를 줄입니다. 생성된 스레드를 재사용하여 스레드 생성 및 소멸 비용을 줄입니다.
        둘째: 응답 속도를 향상시킵니다. 작업이 도착하면 스레드가 생성될 때까지 기다리지 않고 즉시 작업을 실행할 수 있습니다.
        셋째: 스레드 관리 효율성을 향상시킵니다. 스레드는 희소한 자원이므로 제한 없이 생성할 경우 시스템 자원을 소모할 뿐만 아니라 시스템의 안정성을 저하시키므로 스레드 풀을 통합 할당, 튜닝, 모니터링 등에 사용할 수 있습니다.

        스레드 풀은 스레드를 관리하고 재사용하기 위한 메커니즘입니다. 스레드 풀 관리자, 작업 대기열 및 스레드 집합으로 구성됩니다. 스레드 풀 관리자는 스레드 풀에서 스레드를 생성, 삭제 및 모니터링하는 일을 담당합니다. 시스템 로드 및 사전 설정된 조건을 기반으로 스레드 수를 동적으로 조정하여 스레드 풀의 효율적인 활용과 합리적인 할당을 보장합니다. 작업 대기열은 보류 중인 작업을 저장하는 데 사용됩니다. 스레드 풀의 스레드는 작업 대기열에서 작업을 가져와 실행합니다. 작업 수가 스레드 풀의 처리 용량을 초과하면 작업은 일시적으로 대기열에 배치되고 유휴 스레드가 있을 때 처리됩니다.

스레드가 많을수록 좋나요?

  1. 스레드는 자바의 객체이자 운영체제의 자원이기도 하며, 스레드를 생성하고 소멸하는데 시간이 걸린다. 생성 시간 + 회의 시간 > 작업 실행 시간이면 매우 비경제적입니다.
  2. Java 객체는 힙 메모리를 점유하고 운영 체제 스레드는 시스템 메모리를 점유합니다. jvm 사양에 따르면 스레드의 기본 최대 스택 크기는 1M이며 이 스택 공간은 시스템 메모리에서 할당되어야 합니다. 스레드가 너무 많으면 많은 메모리가 소모됩니다.
  3. 운영 체제는 성능에 영향을 미치는 스레드 컨텍스트(각 스레드가 실행되기를 원함)를 자주 전환해야 합니다.

스레드 수를 쉽게 제어할 수 있도록 스레드 풀이 도입되었습니다.

        스레드 풀을 사용할 때 스레드 풀이 예상대로 작동하고 최적의 성능을 제공하도록 스레드 수, 작업 대기열 크기, 작업 예약 전략과 같은 요소를 고려해야 합니다. 동시에, 포착되지 않은 예외로 인해 스레드가 전체 스레드 풀과 충돌하는 것을 방지하기 위해 예외 처리에도 주의를 기울여야 합니다.

스레드 풀을 구축하기 위해 Executors 정적 팩토리를 사용하는 것이 권장되지 않는 이유는 무엇입니까?

        Alibaba Java 개발 매뉴얼에는 다음과 같은 이유로 스레드 풀을 구축하기 위해 Executors 정적 팩토리를 사용할 수 없다고 명시되어 있습니다: 스레드 풀은
Executors를 사용하여 생성할 수 없지만 ThreadPoolExecutor를 통해 생성할 수 있습니다. 이 처리 방법은 쓰기를 수행합니다. 학생들은 스레드 풀에 대해 더 명확하게 알 수 있습니다. 리소스 고갈 위험을 피하기 위해 규칙을 실행합니다. 참고: 실행자가 반환한 스레드 풀 개체의 단점은 다음과 같습니다.

1: FixThreadPool 및 SingleThreadPool:
허용되는 요청 대기열(기본 구현은 LinkedBlockingQueue) 길이는 Integer.MAX_VALUE이며, 이로 인해 많은 수의 요청이 누적되어 OOM이 발생할 수 있습니다. 2: CachedThreadPool 및 ScheduledThreadPool에서 생성할 수 있는 스레드 수는 다음과
같습니다
. 생성될 수 있는 Integer.MAX_VALUE 스레드 수가 많아 OOM이 발생합니다.

        스레드 풀 생성을 위한 올바른 자세: 주로 기본 구현을 사용하지 않기 위해 실행기를 사용하여 스레드 풀을 생성하지 마십시오. 그런 다음 ThreadPoolExecutor 생성자를 직접 호출하여 스레드 풀을 직접 생성할 수 있습니다. 생성 시 BlockQueue의 용량만 지정하면 됩니다.

private static ExecutorService executor=newThreadPoolExecutor(10,10,60L,TimeUnit.SECONDS,new ArrayBlockingQueue(10));

또는 오픈 소스 라이브러리(Apache 및 Guava와 같은 오픈 소스 라이브러리)를 사용하세요.

스레드 풀은 스레드 작업이 완료되었음을 어떻게 알 수 있습니까?

        스레드 풀은 일반적으로 "Future"라는 메커니즘을 사용하여 스레드 작업의 실행 상태를 추적합니다.

        Java에서는 java.util.concurrent.Future비동기 계산 결과를 인터페이스를 통해 표현할 수 있습니다. 스레드 풀에 의해 제출된 작업은 Future 객체를 반환할 수 있으며, 작업 실행이 완료된 후 이 객체를 통해 또는 작업 완료 여부를 통해 작업의 실행 결과를 얻을 수 있습니다.

특히 Future를 사용하면 다음 단계에 따라 스레드 작업이 완료되었는지 확인할 수 있습니다.

  1. 작업 제출: 실행할 작업을 스레드 풀에 제출하고 반환된 Future 객체를 얻습니다.

  2. 작업 상태 확인: Future 메서드를 호출하여 작업이 완료되었는지 여부를 확인합니다 isDone(). 작업이 완료되면 true를 반환하고, 그렇지 않으면 false를 반환합니다.

  3. 작업 결과 가져오기: 작업이 완료되면 Future 메서드를 호출하여 get()작업 실행 결과를 가져올 수 있습니다. 이 메서드는 작업이 완료되고 결과가 반환될 때까지 현재 스레드를 차단합니다.

        작업이 완료되지 않은 경우 get()메서드를 호출하면 작업 실행이 완료될 때까지 현재 스레드가 차단됩니다. 현재 스레드를 차단하지 않으려면 isDone()메서드 폴링을 사용하여 작업 상태를 확인하거나 시간 제한 매개 변수가 있는 메서드를 사용하여 get()결과를 얻을 때까지 일정 시간 동안 기다릴 수 있습니다.

        즉, Future 객체를 사용함으로써 스레드 풀은 스레드 작업의 실행 상태와 결과를 쉽게 추적하고 얻을 수 있으며 이를 통해 작업을 관리하고 제어할 수 있습니다.

참고:

Java에서 스레드 풀을 만드는 7가지 방법! - 레이 형제|www.javacn.site - 블로그 파크(cnblogs.com)

Meituan 비즈니스에서의 Java 스레드 풀 구현 원리 및 실제 - Meituan 기술팀(meituan.com)

JUC 스레드 풀: ThreadPoolExecutor에 대한 자세한 설명 | Java 전체 스택 지식 시스템(pdai.tech)

스레드 풀 인터뷰 질문 - Xiaoyuren - Blog Park (cnblogs.com)

추천

출처blog.csdn.net/weixin_49171365/article/details/129570630