3. Java 스레드 풀의 원리

스레드 풀의 작업은 주로 실행 중인 스레드 수를 제어하는 ​​것입니다. 처리 중에 작업을 대기열에 넣은 다음 스레드가 생성된 후 이러한 작업을 시작합니다. 스레드 수가 최대 수를 초과하면 초과 스레드는 줄을 서서 대기하고 다른 스레드가 실행될 때까지 기다립니다. 완료 후 태스크는 실행을 위해 큐에서 제거됩니다. 주요 기능은 스레드 다중화, 최대 동시성 제어, 스레드 관리입니다 .

Java 스레드 풀 작업 프로세스

1) 스레드 풀이 처음 생성되었을 때 스레드가 없었습니다. 태스크 큐는 매개변수로 전달됩니다. 그러나 대기열에 작업이 있더라도 스레드 풀은 작업을 즉시 실행하지 않습니다.

2) 작업을 추가하기 위해 execute() 메서드를 호출할 때 스레드 풀은 다음과 같이 판단합니다.

    2.1) 실행 중인 스레드 수가 corePoolSize 미만인 경우 이 작업을 실행할 스레드를 즉시 생성합니다.

    2.2) 실행 중인 스레드 수가 corePoolSize보다 크거나 같으면 이 작업을 대기열에 넣습니다.

    2.3) 현재 대기열이 가득 차 있고 실행 중인 스레드 수가 maximumPoolSize 미만인 경우 작업을 즉시 실행하려면 비코어 스레드를 생성해야 합니다.

    2.4) 대기열이 가득 차 있고 실행 중인 스레드 수가 maximumPoolSize보다 크거나 같으면 스레드 풀에서 RejectExecutionException 예외가 발생합니다.

3) 스레드가 작업을 완료하면 대기열에서 다음 작업을 가져와 실행합니다.

4) 스레드가 할 일이 없고 일정 시간(keepAliveTime)을 초과하면 스레드 풀은 현재 실행 중인 스레드의 수가 corePoolSize보다 크면 스레드를 중지한다고 판단합니다. 따라서 스레드 풀의 모든 작업이 완료되면 결국 corePoolSize 크기로 축소됩니다.

 

스레드 풀의 구성

1. 스레드 풀 관리자: 스레드 풀을 생성하고 관리하는 데 사용됩니다.
2. 작업자 스레드: 스레드 풀의 스레드
3. 작업 인터페이스: 각 작업이 구현해야 하는 인터페이스로 작업자 스레드가 작업을 예약하는 데 사용됩니다.
4. 작업 대기열 : 보류 중인 작업을 저장하고 버퍼 메커니즘을 제공하기 위해 사용

매개변수 설명

1.corePoolSize: 스레드 풀의 스레드 수를 지정합니다.

2. maximumPoolSize: 스레드 풀의 최대 스레드 수를 지정합니다.

3. keepAliveTime: 현재 스레드 풀 수가 corePoolSize를 초과하면 중복 유휴 스레드의 생존 시간, 즉 여러 번 파괴됩니다.

4.unit: keepAliveTime의 단위.

5.workQueue: 작업 대기열, 제출되었지만 아직 실행되지 않은 작업.

6. threadFactory: 스레드를 생성하는 데 사용되는 스레드 팩토리이며 일반적으로 기본값을 사용합니다.

7.handler: 거부 전략, 처리할 작업이 너무 많을 때 작업을 거부하는 방법.

거부 정책

스레드 풀의 스레드가 모두 사용되어 계속해서 새 작업을 처리할 수 없으며 동시에 대기 대기열이 가득 차서 새 작업을 채울 수 없습니다. 이때 우리는 이 문제를 합리적으로 다루기 위한 정책 메커니즘을 거부해야 합니다.

JDK의 기본 거부 정책은 다음과 같습니다.

1. AbortPolicy: 시스템이 정상적으로 실행되지 않도록 직접 예외를 발생시킵니다.

2. CallerRunsPolicy : 스레드 풀이 닫히지 않는 한 이 정책은 현재 폐기된 작업을 호출자 스레드에서 직접 실행합니다. 분명히 이렇게 하면 실제로 작업이 중단되지는 않지만 작업 제출 스레드의 성능이 크게 떨어질 가능성이 큽니다 .

3. DiscardOldestPolicy : 가장 오래된 요청, 즉 실행을 앞둔 작업을 버리고 현재 작업을 다시 제출하려고 합니다.

4. DiscardPolicy: 이 정책은 처리 없이 처리할 수 없는 작업을 자동으로 삭제합니다. 작업이 손실될 수 있는 경우 이것이 가장 좋은 솔루션입니다.

위의 기본 제공 거부 전략은 모두 RejectedExecutionHandler 인터페이스를 구현합니다.위 전략이 여전히 실제 요구를 충족할 수 없는 경우 RejectedExecutionHandler 인터페이스를 직접 확장할 수 있습니다.

추천

출처blog.csdn.net/lzzyok/article/details/121325233