>  기사  >  Java  >  Java 인터뷰 스레드 풀

Java 인터뷰 스레드 풀

王林
王林앞으로
2020-12-17 10:12:282213검색

Java 인터뷰 스레드 풀

다음은 Java 인터뷰에서 정리한 몇 가지 일반적인 스레드 풀 질문이며, 지금 공유하겠습니다.

(학습영상공유 : java 교육영상)

스레드풀이란?

스레드 풀은 멀티 스레드 처리 형태로, 처리 중에 작업이 스레드 풀에 제출되고 작업 실행은 스레드 풀에서 관리됩니다.

각 요청이 처리할 스레드를 생성하면 서버의 리소스가 곧 소진됩니다. 스레드 풀을 사용하면 생성 및 삭제되는 스레드 수가 줄어들고 각 작업자 스레드를 재사용할 수 있으며 여러 작업을 실행할 수 있습니다.

스레드 풀을 사용하는 이유는 무엇인가요?

스레드를 생성하고 파기하는 데 드는 비용은 상대적으로 크며, 이러한 시간은 업무 처리 시간보다 길어질 수 있습니다. 이러한 빈번한 스레드 생성 및 소멸은 비즈니스 작업자 스레드와 결합되어 시스템 리소스 시간을 소모하게 되며, 이로 인해 시스템 리소스가 부족해질 수 있습니다. (스레드 생성 및 소멸 과정을 제거할 수 있습니다.)

스레드 풀의 역할은 무엇인가요?

스레드 풀의 기능은 시스템의 실행 스레드 수를 제한하는 것입니다.

1. 효율성을 향상시킵니다. 특정 수의 스레드를 만들어 풀에 넣고 필요할 때 풀에서 가져옵니다. 이는 필요할 때 스레드 개체를 만드는 것보다 훨씬 빠릅니다.

2. 관리를 용이하게 하기 위해 스레드 풀 관리 코드를 작성하여 풀의 스레드를 균일하게 관리할 수 있습니다. 예를 들어 프로그램이 시작될 때마다 스레드가 작업에 할당됩니다. 동시 발생하는 경우 101개의 요청이 있으며, 끝없는 스레드 생성으로 인한 시스템 충돌을 방지하기 위해 추가 요청을 대기열에 넣을 수 있습니다.

몇 가지 일반적인 스레드 풀과 사용 시나리오에 대해 이야기해 보겠습니다.

1. newSingleThreadExecutor

작업을 실행하는 데 유일한 작업 스레드만 사용하여 모든 작업이 지정된 순서(FIFO)로 이루어지도록 합니다. , LIFO, 우선순위) 실행.

2. newFixedThreadPool

최대 동시 스레드 수를 제어할 수 있는 고정 길이 스레드 풀을 생성합니다.

3. newCachedThreadPool

캐시 가능한 스레드 풀을 생성합니다. 스레드 풀의 길이가 처리 요구량을 초과하는 경우, 재활용할 방법이 없으면 유휴 스레드를 유연하게 재활용할 수 있습니다.

4. newScheduledThreadPool

예약 및 주기적인 작업 실행을 지원하는 고정 길이 스레드 풀을 만듭니다.

스레드 풀의 몇 가지 중요한 매개변수

corePoolSize는 스레드 풀에 있는 코어 스레드의 수입니다. 이러한 코어 스레드는 사용되지 않을 때만 재활용되지 않습니다.

maximumPoolSize는 스레드 풀에 수용할 수 있는 최대값입니다. 스레드 수

keepAliveTime은 코어 스레드를 제외한 스레드 풀에서 작업이 없을 때에도 삭제될 수 없기 때문에 코어 스레드를 제외한 다른 스레드가 스레드 풀에 유지될 수 있는 가장 긴 시간입니다. 비코어 스레드가 유지할 수 있는 가장 긴 유휴 시간을 의미하는 생존 시간

util은 이 시간을 계산하는 단위입니다.

workQueue는 실행을 기다리는 작업 대기열에 저장될 수 있으며 FIFIO 원칙(선입선출)을 구현합니다.

(공유할 추가 면접 질문: java 면접 질문 및 답변)

threadFactory는 스레드를 생성하는 스레드 팩토리입니다.

핸들러는 작업이 가득 찬 후에 특정 작업 수행을 거부할 수 있는 거부 전략입니다.

스레드 풀의 거부 전략에 대해 이야기해 보겠습니다

요청 작업이 계속해서 오고 시스템이 현재 이를 처리할 수 없는 경우 채택해야 할 전략은 서비스 거부입니다. RejectedExecutionHandler 인터페이스는 작업 처리를 거부하는 사용자 정의 방법을 제공합니다. ThreadPoolExecutor에는 네 가지 처리 전략이 포함되어 있습니다.

AbortPolicy 전략: 이 전략은 직접적으로 예외를 발생시키고 시스템이 정상적으로 작동하지 못하게 합니다.

CallerRunsPolicy 정책: 스레드 풀이 닫히지 않는 한 이 정책은 현재 삭제된 작업을 호출자 스레드에서 직접 실행합니다.

DiscardOleddestPolicy 전략: 이 전략은 곧 실행될 작업인 가장 오래된 요청을 삭제하고 현재 작업을 다시 제출하려고 시도합니다.

DiscardPolicy 전략: 이 전략은 처리 없이는 처리할 수 없는 작업을 자동으로 삭제합니다.

JDK에서 기본적으로 제공하는 네 가지 거부 전략 외에도 자체 비즈니스 요구에 따라 거부 전략을 사용자 정의할 수 있습니다. 사용자 정의 방법은 매우 간단합니다. RejectedExecutionHandler 인터페이스를 직접 구현하면 됩니다.

실행과 제출의 차이점은 무엇인가요?

이전 설명에서는 실행 메소드를 사용하여 작업을 실행했지만, 제출한 작업을 실행할 수 있는 submit 메소드도 있습니다.

이 두 가지 방법의 차이점은 무엇인가요? 어떤 시나리오에 적용할 수 있나요? 간단한 분석을 해보겠습니다.

execute는 반환 값에 주의할 필요가 없는 시나리오에 적합합니다. 실행을 위해 스레드를 스레드 풀에 던지기만 하면 됩니다.

제출 방법은 반환 값에 주의해야 하는 시나리오에 적합합니다.

5개 스레드 풀의 사용 시나리오

newSingleThreadExecutor: 순차 실행이 보장되어야 하고 하나의 스레드만 실행되는 시나리오에서 사용할 수 있는 단일 스레드 스레드 풀입니다.

newFixedThreadPool: 알려진 동시성 압력 하에서 스레드 수를 제한하는 데 사용할 수 있는 고정 크기 스레드 풀입니다.

newCachedThreadPool: 무한히 확장할 수 있는 스레드 풀로, 실행 시간이 상대적으로 짧은 작업을 처리하는 데 더 적합합니다.

newScheduledThreadPool: 지연 및 예약으로 시작될 수 있는 스레드 풀로, 정기적인 작업을 수행하기 위해 여러 백그라운드 스레드가 필요한 시나리오에 적합합니다.

newWorkStealingPool: 연결 수를 줄이고 병렬 실행을 위해 현재 사용 가능한 CPU 수로 스레드를 생성할 수 있는 여러 작업 대기열이 있는 스레드 풀입니다.

스레드 풀 닫기

스레드 풀 닫기는 shutdownNow 및 shutdown 메서드를 호출하여 수행할 수 있습니다

shutdownNow: 실행 중인 모든 작업에 대해 Interrupt()를 실행하고, 실행을 중지하고, 아직 시작되지 않은 모든 작업을 취소하고, 다음으로 돌아갑니다. 아직 시작되지 않은 작업 목록입니다.

shutdown: 종료를 호출하면 스레드 풀은 더 이상 새 작업을 허용하지 않지만 제출되었거나 실행 중인 작업을 강제로 종료하지는 않습니다.

스레드 풀 초기화 시 스레드 수 선택

작업이 IO 집약적이라면 일반적으로 CPU 리소스 사용을 극대화하기 위해 스레드 수를 CPU 수의 2배 이상으로 설정해야 합니다.

작업이 CPU를 많이 사용하는 경우 일반적으로 스레드 수는 CPU 수에 1을 추가하여 설정하면 됩니다. 스레드가 많으면 컨텍스트 전환만 증가할 수 있지만 CPU 사용률은 증가할 수 없습니다.

위 내용은 단지 기본적인 아이디어일 뿐입니다. 정말 정밀한 제어가 필요한 경우에는 온라인 상태가 된 후에도 스레드 풀의 스레드 수와 대기열을 관찰해야 합니다.

스레드 풀에는 어떤 종류의 작업 큐가 있나요? 1. ArrayBlockingQueue

는 배열 구조를 기반으로 하는 제한된 차단 큐입니다. 이 큐는 FIFO(선입선출) 원칙에 따라 요소를 정렬합니다.

2. LinkedBlockingQueue

연결된 목록 구조를 기반으로 하는 차단 대기열입니다. 이 대기열은 FIFO(선입 선출)에 따라 요소를 정렬하며 처리량은 일반적으로 ArrayBlockingQueue보다 높습니다. 정적 팩토리 메소드 Executors.newFixedThreadPool()은 이 큐

3, 동기식 큐

요소를 저장하지 않는 차단 큐를 사용합니다. 각 삽입 작업은 다른 스레드가 제거 작업을 호출할 때까지 기다려야 합니다. 그렇지 않으면 삽입 작업이 항상 차단되고 처리량은 일반적으로 LinkedBlockingQueue보다 높습니다. 정적 팩터리 메서드 Executors.newCachedThreadPool은 이 대기열을 사용합니다.

4. PriorityBlockingQueue

우선순위가 있는 무한 차단 대기열입니다.

관련 강좌 추천:

Java 입문 튜토리얼

위 내용은 Java 인터뷰 스레드 풀의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제