CPU 코어의 수가 증가함에 따라 멀티 스레딩 기술을 사용하여 컴퓨팅 성능을 최대한 활용하는 것은 불가피합니다. 따라서 멀티 스레딩 기술은 서버 개발자가 마스터 해야하는 기술입니다.
스레드의 생성 및 파괴에는 시스템 호출과 시스템 리소스를 소비하므로 스레드 풀링 기술이 소개되어 자주 스레드 생성 및 파괴를 피합니다.
Java에는 우리를 위해 스레드 풀을 만들 수있는 집행자 도구 클래스가 있습니다. 본질은 새로운 ThreadPooleExecutor 객체를 새로운 것입니다. 스레드 풀은 거의 인터뷰 질문에 반드시 반드시해야합니다. 이 섹션은 소스 코드를 결합하여 ThreadExecutor의 작동 원리에 대해 이야기합니다.
1. 스레드 풀 생성
먼저 ThreadPooleExecutor의 가장 완전한 생성자 매개 변수를 살펴 보겠습니다.
Corepoolsize : 스레드 풀의 핵심 스레드 수. 둔하게 말하면, 스레드 풀에 작업이 없더라도 CorePoolSize 스레드가 작업을 기다리고 있습니다.
maximumpoolsize : 최대 스레드 수. 제출 한 작업 수에 관계없이 스레드 풀의 최대 작업자 스레드 수는 Maximumpoolsize입니다.
weepalivetime : 실의 생존 시간. 스레드 풀의 스레드 수가 CorePoolSize보다 큰 경우, KeepAlivetime을 기다린 후 실행할 작업이 없으면 스레드가 종료됩니다.
init : 이것은 seconds : timeUnit.seconds와 같은 Keepalivetime의 단위를 지정하는 데 사용됩니다.
⑥ Workqueue : 차단 대기열 및 제출 된 작업 이이 대기열에 배치됩니다.
stride threadfactory : 스레드 공장, 스레드를 생성하는 데 주로 스레드를 지명하는 데 사용됩니다. 기본 공장 스레드 이름은 Pool-1-Shread-3입니다.
⑧ handler : 스레드 풀의 스레드가 소진되고 대기열이 가득 차있을 때 호출되는 정책을 거부합니다.
위는 스레드 풀을 만들 때 사용되는 매개 변수입니다. 면접관은 종종 인터뷰 중에이 질문을합니다.
2. 스레드 풀 실행 프로세스
다음은 스레드 풀의 실행 프로세스를 설명하는 다이어그램입니다.
작업이 스레드 풀에 제출되면 먼저 현재 스레드 수가 CorePoolSize보다 적습니다. 보다 적은 경우 제출 된 작업을 실행하기 위해 스레드가 생성됩니다. 그렇지 않으면 작업이 Workqueue 대기열에 넣습니다. Workqueue가 가득 차면 현재 스레드 수가 MaximumpOollsize보다 적습니다. 보다 적은 경우 작업을 실행하기 위해 스레드가 생성됩니다. 그렇지 않으면 스레드 풀이 작업 수신을 거부한다는 것을 나타 내기 위해 핸들러가 호출됩니다.
여기서는 특정 구현을 확인하기 위해 JDK1.8.0_111의 소스 코드를 예로 들어보십시오.
1. 먼저 실 풀의 집행자 방법을보십시오.
① : 현재 활성 스레드 수가 CorePoolSize보다 작습니다. 보다 적은 경우 AddWorker에게 전화하여 스레드를 작성하여 작업을 실행하십시오.
② : CorePoolSize보다 작지 않은 경우 작업 큐 대기열에 작업을 추가하십시오.
③ : Workqueue가 Workqueue에 넣으면 생성 스레드가 작업을 실행합니다. 현재 생성 스레드가 실패하면 (현재 스레드 수는 maximumpoolsize 이상이 아닙니다), 거부는 (내부 통화 핸들러)로 호출되고 작업 수락을 거부합니다.
2. AddWorker 메소드 구현을 살펴 보겠습니다
이 코드는 비 코어 스레드를 만들 때, 즉 Core는 False와 같습니다. 현재 스레드 수가 MaxImumpOollsize보다 크지 여부를 결정하십시오. 그것이 거짓보다 크거나 같거나, 즉, 위에서 언급 한 ③에서 실의 생성이 실패했습니다.
AddWorker 방법의 후반 :
worker 작업자 객체를 생성하고 스레드 객체를 인스턴스화합니다.
이 스레드를 시작하십시오
3. 작업자에게 가서 구현을보십시오
스레드를 만들기 위해 작업자를 만들 때 ThreadFactory가 호출되는 것을 볼 수 있습니다. 위의 스레드를 시작하면 스레드가 호출 할 작업자의 실행 메소드가 트리거됩니다.
4. 다음으로, 런 워크 사람 방법의 논리를 살펴 보겠습니다.
스레드는 runwoker를 호출하고 루프 중에 GetTask 메서드를 호출하여 Workerqueue에서 작업을 읽은 다음 작업을 실행합니다. getTask 메서드가 NULL을 반환하지 않는 한이 스레드는 종료되지 않습니다.
5. 마지막으로 GetTask 메소드 구현을 살펴 보겠습니다.
rest wc> corepoolsize는 현재 스레드 수가 CorePoolSize보다 큰지 여부를 결정합니다.
② 현재 스레드 수가 CorePoolSize보다 크면 작업 큐의 설문지 방법이 호출되어 작업을 얻고 시간 초과는 keepalivetime입니다. KeepAlivetime의 시간이 시간 제한을 초과하면 폴링이 널 리턴되고 위에서 언급 한 동안 순서대로 종료되고 스레드가 실행됩니다.
현재 스레드 수가 CorePoolSize보다 작 으면 현재 작업 큐의 테이크 메소드가 호출되어 현재 차단됩니다.
위의 기사는 스레드 풀의 작동 원리 및 소스 코드 해석을 기반으로합니다. 이 기사는 편집자가 공유하는 모든 내용입니다. 나는 그것이 당신에게 참조를 줄 수 있기를 바랍니다. 그리고 당신이 wulin.com을 더 지원할 수 있기를 바랍니다.