한 기사에서 스레드 풀의 작동 원리 읽기

머리말

이 기사에서는 스레드 풀의 작업 프로세스를 비교하기위한 프로그래머의 요구 사항 예제를 사용합니다. 이야기의 고유 한 방식으로 전개하고, 스레드 풀의 작동 원리를 설명하여 스레드 풀을 더 잘 이해할 수 있도록 읽어 주셔서 감사합니다 ~

  • 스레드 풀이 란 무엇입니까?
  • 코어 스레드 란 무엇입니까?
  • 차단 대기열이란 무엇입니까?
  • 자유 시간이란 무엇입니까?
  • 포화 전략이란 무엇입니까?
  • 포화 전략이란 무엇입니까?
  • 스레드 풀 작동 원리 흐름도 및 소스 코드 개요

스레드 풀이 란 무엇입니까?

"Little Ape"는 부지런하고 열심히 일하며 밤낮으로 일하다가 마침내 회사 이사로 승진하여 회사의 일상 업무를 담당합니다.

어느 날 상사는 샤오위 안을 찾아 "우리 회사에 직원이 점점 더 많아지고 있습니다. **"직원 관리 시스템 "**을 구축하고 싶습니다. 한 달 안에 정리할 수 있습니다. "작은 원숭이가 가슴을 두 드려요. 문제 없습니다!"

회사에 아직 프로그래머가 없기 때문에 Xiao Yuan은 신속하게 ** "Zhubajie.com"을 열고 직원 관리 시스템 요구 사항을 제출했습니다. 잠시 후 "개발자 (이름, 스레드 A)"**가 주문을 받고 협상을 진행했습니다. 계약, 개발 시작, 시스템 납품 ... 일련의 프로세스와 1 개월 후 완전한 직원 관리 시스템이 드디어 완성됩니다 ... 상사는 대단히 감사합니다 ~

얼마 지나지 않아 사장님은 "회사에서 점점 더 많은 사람들이 늦었 으니 **"출석 시스템 "을 구축합시다 !"라고 다시 말했습니다. Xiaoyuan은 작업을 받고 즉시 Zhubajie.com으로 이동하여 수요를 요청하고 누군가를 찾기 시작했습니다. 이번에는 "Thread B가 주문을받습니다"** ...

고인은 이렇습니다. 월말에 사장님은 급여 시스템 개발의 필요성을 내세웠습니다 ... 작은 원숭이는 그의 두피가 마비되었다는 소식을 들었습니다. 언젠가는 온라인에서 누군가를 찾기 위해 반복합니다! "비용을 절약하기 위해 몇 명의 프로그래머 (스레드 a, b, c)를 고용하고 자체 IT 기술 부서를 구축하는 것이 어떻습니까! IT 부서에 전화 해 **"스레드 풀 "**!"보스 들었다. 히트!

스레드 풀은 스레드 관리를위한 풀로, 처리 할 작업이있을 경우 새 스레드가 자주 생성되지 않고 처리를 위해 풀에서 스레드를 가져옵니다. 작업이 실행될 때 스레드는 파괴되지 않고 다음 작업을 기다리고 있습니다.

코어 스레드 란 무엇입니까?

"Thread Pool" IT 부서를 설립 한 후 회사와 공식적인 계약 관계를 맺은 직원 a, b, c를 여러 명 고용했으며 "Little Ape" 는 정규 직원 몇 명을 "핵심 스레드" 로 관리했습니다 . 상사가 요구를 내렸을 때, Xiao Tian 달팽이는 ** "현재 작업 없음"**이라는 스레드에 요구 사항을 할당했습니다.

차단 대기열이란 무엇입니까?

어느 날 아침 사장님은 졸려했습니다. 회사에 들어 와서 "네 가지 요구 사항"을 한 번에 언급 했는데 a, b, c가 주문을 따랐 는데도 여전히 하나의 필수 작업이 있다는 것을 알았습니다. 이것을 어떻게 배열합니까? 다시 누군가를 찾기 위해 "Zhu Ba Jie 아르바이트 네트워크" 에 가셨습니까? "스레드 풀 IT 부서"**를 신설하고 누군가를 찾아가도 (스레드 작업) 사람들은 큰 소리로 웃을 것입니다!

똑똑한 꼬마 원숭이는 좋은 방법을 생각합니다. DPMS 수요 풀을 구축하고 할당되지 않은 수요를 DPMS 수요 풀에 넣어 완료 한 다음 a, b, c가 먼저 작업을 완료 할 때까지 기다린 다음이를 넣을 수 있습니다. 작업은 멀리이 끕니다. 이 DPMS 수요 풀, 이름을 ** "blocking queue" , 영어 이름 "WorkQueue"**로 지정하겠습니다!

비 코어 스레드 란 무엇입니까?

화창한 오후에 사장님은 커피 한 잔을 마 셨습니다. 그가 자유로울 때는 괜찮 았기 때문에 ** "차단 대기열" (DPMS 수요 풀)로 달려가 보고 첫눈에 바보였습니다. ! ! 수요 풀에 수십 개의 수요가 누적되었으며 일정이 꽉 찼습니다. 상사는 즉시 "사무실의 작은 원숭이"**에게 전화를 걸어 이러한 까다로운 작업을 처리하는 방법을 논의했습니다.

"또는 얼마나 더 많은 직원을 고용합니까 (**"핵심 스레드 " )? "아니, 아니, 회사의 재정적 "오버 헤드 "**가 좀 큽니다! "

"그렇지 않으면 업무 요구 사항을 줄여달라고 비즈니스에 요청 합니까? ( "더 적게 요청 " )" "당신이 멍청하고 덜 요청하는 건가요? 자신의 돈을 삭감하지 않습니까? 집에 가서 먼저 방법을 생각하세요! ! "사장님 목소리를 크게 ~

작은 유인원은 집에 가서 눈을 감고 신들에게 맡기고 매일 일찍 잠자리에 들었고 창밖의 소리도 듣지 못했습니다 ... 드디어 어느 날 꿈의 향기로 좋은 길을 생각했습니다. "보스, 우리는 다른 회사 ( "아웃소싱 회사 " )에 가서 일정 기간 동안 몇 명의 직원 (이름이 d, e, f, g라고 가정)을 고용하고 그들이하도록 할 수 있습니다. **"DPMS 수요 풀 ( 차단 대기열) "* * 내부 수요. 요구 사항이 충족 될 때까지 기다렸다가 다시 보내십시오. "상사는 그 말을 듣고 기뻐합니다.이 계획은 훌륭하고 그는 행복합니다. "누군가가 필요한 작업을 수행했고 회사는 비용을 절약합니다. 두 가지 장점을 모두 갖추고 있습니다. " ~ 이러한 아웃소싱 직원 (d , e, f, g), ** "비 핵심 스레드"**라고 부르겠습니다.

자유 시간이란 무엇입니까?

d, e, f, g는 직원 ( "비 핵심 스레드" )을 아웃소싱했기 때문에 상사는 안도의 한숨을 쉬고 많은 일을했고 마침내 누군가가 해냈습니다.

그러나 또 다른 날, 이른바 근무 외 시간 인 7시에, 상사는 사무실을 나갔고 "스레드 풀" 의 IT 부서 직원들이 모두 서둘러 나가는 것을 발견했습니다 . 나는 화가 났다 . " 왜이 팬들은 근무 시간이 끝났을 때 달아 났고, 작업이 너무 포화 상태가 아니었다 "**? 그는 DPMS 수요 풀을 클릭하여 원래 수요가 충족되었음을 알았습니다. . . 급여를 지불해야하는 아웃소싱 동료 (비 핵심 스레드)도 많이 있는데,이 손실의 물결은 엄청납니다 ~

다음날 Xiao Yuan은 DPMS 수요 풀에 수요가 없기 때문에 ** "비밀"에 의해 사장실로 호출되었습니다. 아웃소싱 된 동료 (비 핵심 스레드)를 돌려 보낼 건가요? 그러나 일반적으로 수요가 없으면 즉시 다시 돌아 가게하세요 ( "실 재활용"**). 수요가 갑자기 다시 발생하면 조금 버틸 수 없습니다.

"아니면 15 일 또는 10 일 후 풀이 비워 질 때까지 기다릴 때 아웃소싱 동료 ( "비 핵심 스레드 " )가 다시 돌아가도록할까요? "이 정의에 정의 된 15 일 또는 10 일은 **"스레드 유휴 생존 시간 "**입니다.

포화 전략이란 무엇입니까?

더블 11이 다가 오자 사장님은 많은 요구를 제기했을뿐만 아니라 새로운 운영중인 여성들도 많은 요구를 제기했습니다. 원천에서 흐르는 물처럼 새로운 수요가오고 있어요 ~

먼저 "스레드 풀" IT 부서 a, b, c 세 명의 공식 직원 (코어 스레드)이 수요를 처리 하느라 바쁘고 ( "request" ) DPMS 수요 풀 ( "blocking queue" )도 혼잡합니다. 마지막으로 d, e, f, g 아웃소싱 동료 ( "비 핵심 스레드" ) 조차도 매우 바쁩니다.

이때 수요가 아직 끝나지 않았는데 어떻게해야하나요? Double 11에서 온라인에 접속하는 것은 어떻습니까? 작은 원숭이는 ** "조수가 일어나고 슬픔이 조수에 이르렀다"**에서 슬픈 표정을지었습니다.

** "포화 전략"을 사용하는 것 외에 다른 방법은 없습니다 . 예를 들어, "discard demand tasks" ? "예외를 버리고 상사에게 수요를 늘리지 말라고 말하십시오" ? "수요 풀에서 가장 오래된 수요 작업 폐기" ? 또는 "요청한 사람에게 건네 줘"**?

마지막으로 상사는 "새로운 요구 사항 제기를 거부했다"고 결정 했기 때문에 ** "스레드 풀"** IT 부서는 여전히 정상적으로 운영되고 있습니다 ~

라인 시티 풀에는 4 가지 주요 유형의 포화 전략 이벤트가 있습니다.

  • AbortPolicy (예외 발생, 기본값)
  • DiscardPolicy (새로 제출 된 작업은 직접 삭제됨)
  • DiscardOldestPolicy (큐에서 가장 오래된 작업을 버리고 현재 작업을 스레드 풀에 계속 제출)
  • CallerRunsPolicy (처리를 위해 스레드 풀이 호출되는 스레드로 전달됨, 즉 일부 작업이 호출자에게 롤백 됨)

스레드 풀 작동 원리 흐름도 및 소스 코드 개요

이야기는 끝났으니 스레드 풀의 워크 플로우를 살펴 보겠습니다 ~

관심있는 친구들도 소스 코드를 확인 해주세요 ~

  if (command == null)
            throw new NullPointerException();
        int c = ctl.get();
        //判断当前活跃线程数是否小于corePoolSize
        if (workerCountOf(c) < corePoolSize) {
            //如果小于,则调用addWorker创建线程执行任务
            if (addWorker(command, true))
                return;
            c = ctl.get();
        }
        //如果大于等于corePoolSize,则将任务添加到workQueue队列。
        if (isRunning(c) && workQueue.offer(command)) {
            int recheck = ctl.get();
            if (! isRunning(recheck) && remove(command))
                reject(command);
            else if (workerCountOf(recheck) == 0)
                addWorker(null, false);
        }
        //如果放入workQueue队列失败,则创建非核心线程执行任务    
        else if (!addWorker(command, false))
            //(如果这时创建线程失败(当前线程数大于等于maximumPoolSize时))
            调用reject拒绝接受任务
            reject(command);

이 기사는 https://xie.infoq.cn/article/ 29b6ca1c907a80b7d6149897b에서 전송되었습니다.

[ 지식의 보급, 가치 공유 ] 여러분의 관심과 성원에 감사드립니다. 저는 망설이는 인터넷 이주 노동자 [ Zhuge Xiaoyuan ]입니다.

추천

출처blog.csdn.net/wuxiaolongah/article/details/109520771