답변:
스레드 풀은 작업 준비가 된 사전 인스턴스화 된 유휴 스레드 그룹입니다. 적은 수의 긴 작업 대신 짧은 수의 짧은 작업이 수행 될 때 각 작업에 대해 새 스레드를 인스턴스화하는 것보다 선호됩니다. 이렇게하면 스레드를 여러 번 만드는 오버 헤드가 발생하지 않습니다.
구현은 환경에 따라 다르지만 간단히 말하면 다음이 필요합니다.
Task
하는 execute()
메소드로 호출 된 추상 클래스 일 수 있습니다 .스레드 풀이 작성되면 구현의 요구에 따라 사용 가능한 스레드 수를 인스턴스화하거나 필요에 따라 새 스레드를 작성합니다.
풀이 a를 전달 Task
하면 컨테이너에서 스레드를 가져 오거나 컨테이너가 비어있는 경우 스레드를 사용할 수있을 때까지 기다렸다가 a Task
를 전달하고 장벽을 충족시킵니다. 이로 인해 유휴 스레드가 실행을 재개 하고 주어진 스레드의 execute()
메소드를 호출합니다 Task
. 실행이 완료되면 스레드가 풀을 다시 풀로 가져 와서 재사용을 위해 컨테이너에 넣은 다음 장벽을 만나 사이클이 반복 될 때까지 잠자기 상태가됩니다.
스레드 풀은 일반적으로 대기열로 구성된 관리되는 스레드 모음으로, 작업 대기열에서 작업을 실행합니다.
비동기 적으로 무언가를 실행해야 할 때마다 새로운 스레드 객체를 생성하는 것은 비용이 많이 듭니다. 스레드 풀에서는 비동기 적으로 실행하려는 작업을 작업 대기열에 추가하기 만하면 스레드 풀은 해당 작업에 사용 가능한 스레드를 할당합니다. 작업이 완료 되 자마자 현재 사용 가능한 스레드는 다른 작업을 요청합니다 (남은 것이 있다고 가정).
스레드 풀을 사용하면 실제로 필요한 것보다 많은 스레드를 만들거나 제거하지 않아도됩니다.
스레드 대기열과 작업 대기열로 클래스를 만드는 것으로 시작합니다. 그런 다음 작업을 작업 대기열에 추가하고 거기서부터 작업을 추가하는 방법을 구현하십시오. 분명히 스레드 풀에서 허용되는 최대 스레드를 설정할 수 있어야합니다.
실제 예;
12 명이 근무하는 시설이 있습니다. 이 시설에는 3 개의 섹션이 있습니다. 주방, 화장실 및 보안. 스레드 풀 기술을 사용하지 않는 경우 작동 방식 : 12 명 모두 회의실에 서있을 것 회의실로 돌아옵니다. 그러나 그들이 의무를 다하기 전에 준비 단계가 있습니다. 그들은 올바른 유니폼을 착용하고, 특정 장치를 장착하고, 해당 구역으로 걸어 가고, 작업을 마치고 돌아와야합니다. 따라서 일을 마칠 때마다 (실이 끊어짐) 회의실로 돌아가 유니폼을 벗고 장비를 꺼내 다음 작업을 기다려야합니다. 이것은 스레드 컨텍스트를 생성하는 것으로, OS별로 메모리 할당 및 추적 정보입니다.
스레드 풀링을 사용하는 경우 이른 아침에는 부엌에 6 명, 화장실에 2 명, 보안에 4 명을 할당합니다. 그래서 그들은 하루에 한 번만 준비를 할 것입니다. 부엌에 고객이 없더라도 다가오는 작업을 위해 유휴 상태에있는이 4 명이 방문합니다. 부엌이 닫힐 때까지 회의실로 돌아갈 필요가 없습니다 (앱 종료). 이 4 명은 키친 앱 풀에 있으며 빠르게 서비스 할 수 있습니다. 그러나 부엌이 때때로 유휴 상태가 될 수 있기 때문에 하루 종일 일한다고 약속 할 수는 없습니다. 화장실과 보안에도 동일한 논리가 적용됩니다.
첫 번째 시나리오에서는 모든 작업에 스레드를 낭비하지 않지만 각 작업에 대해 모든 단일 스레드를 준비하는 데 시간이 오래 걸립니다. 두 번째 단계에서는 미리 스레드를 준비하므로 모든 작업에 모든 스레드를 사용한다고 보장 할 수는 없지만 OS는 대부분 그에 대한 최적화를 수행하므로 안전하게 신뢰할 수 있습니다.