자바 병렬 프로 그래 밍 면접 스 레 드 풀

무엇이 스 레 드 탱크 입 니까?
연못 화 사상 을 바탕 으로 라인 을 관리 하 는 도구 이다.지 화 기술:지 화 기술 은 간단하게 말하자면 대량의 자원 을 미리 보존 하여 불 시의 수요 에 대비 하 는 것 이다.예 를 들 어 우리 의 대상 풀,데이터베이스 연결 풀 등 이다.
스 레 드 탱크 장점
우 리 는 왜 스 레 드 풀 을 사용 해 야 합 니까?직접 new thread start 가 좋 지 않 습 니까?
  • "자원 소 모 를 줄 입 니 다":이미 만 든 스 레 드 를 반복 적 으로 이용 하여 스 레 드 생 성 과 소각 으로 인 한 소 모 를 줄 입 니 다.
  • "응답 속도 향상:"작업 이 도착 하면 즉시 실행 할 수 있 습 니 다.스 레 드 가 생 성 될 때 까지 기 다 렸 다가 작업 을 수행 할 필요 가 없습니다.
  • '스 레 드 의 관리 성 향상:'스 레 드 는 희소 한 자원 이다.만약 에 무제 한 으로 만 들 면 시스템 자원 을 소모 할 뿐만 아니 라 스 레 드 의 불합리한 분포 로 인해 자원 관리 불 균형 을 초래 하고 시스템 의 안정성 을 낮 출 수 있다.스 레 드 탱크 를 사용 하면 통 일 된 분배,조정 과 감 시 를 할 수 있다.
  • 스 레 드 탱크 의 실행 절차
    먼저 스 레 드 탱크 의 실행 프로 세 스 도 를 살 펴 보 겠 습 니 다.이 그림 은 문 말 참조 1 에서 나 왔 습 니 다.

    상기 그림 을 통 해 우 리 는 라인 풀 에서 임 무 를 수행 할 수 있 고 다음 과 같은 몇 가지 상황 이 있 을 수 있다.
  • 현재 실행 스 레 드 가 core Size 보다 작 으 면 새 스 레 드 를 만들어 작업 을 수행 합 니 다.
  • 현재 실행 중인 스 레 드 가 core Size 나 불필요 한 core Size(동적 으로 core Size 를 수정 해 야 이러한 상황 이 발생 할 수 있 습 니 다)와 같 으 면 작업 을 차단 대기 열 에 넣 습 니 다.
  • 대기 열 이 가득 차 서 새로 추 가 된 작업 을 넣 을 수 없다 면 새로운 스 레 드 를 만들어 서 작업 을 수행 해 야 합 니 다.
  • 새로 만 든 스 레 드 가 최대 스 레 드 수 에 도달 하면 작업 이 거 부 됩 니 다.
  • 스 레 드 풀 을 어떻게 사용 합 니까?
    자바 jdk 의 Executors 는 서로 다른 스 레 드 풀 을 만 드 는 방법(일반적으로 추천 하지 않 음)을 제공 합 니 다.알 리 바 바 의 개발 매 뉴 얼 도 Executors 를 통 해 만 들 지 못 하도록 강제 규정 하고 있 습 니 다.일부 회사 의 개발 규범 에 도 있 을 것 입 니 다.
    newFixedThreadPool newSingleThreadExecutor newCachedThreadPool newScheduledThreadPool
    newWorkStealingPool (jdk 1.8 새로 추 가 된)스 레 드 풀 Executor 를 사용 하여 스 레 드 풀 을 만 들 수 있 습 니 다.
    
      public ThreadPoolExecutor(int corePoolSize,
                                  int maximumPoolSize,
                                  long keepAliveTime,
                                  TimeUnit unit,
                                  BlockingQueue<Runnable> workQueue,
                                  ThreadFactory threadFactory,
                                  RejectedExecutionHandler handler) 
                                  
    우 리 는 스 레 드 탱크 를 만 드 는 데 7 개의 매개 변수 가 있 음 을 알 수 있 습 니 다.상기 우리 가 Executors 도구 류 를 통 해 만 든 스 레 드 탱크 는 한두 개의 매개 변수 입 니 다.다른 매개 변 수 는 모두 우리 에 게 기본 적 으로 쓰 여 죽 었 습 니 다.우 리 는 이 몇 개의 매개 변 수 를 진정 으로 이해 해야만 스 레 드 탱크 를 더욱 잘 사용 할 수 있 습 니 다.다음은 이 일곱 개의 매개 변수(스 레 드 탱크 매개 변수)를 살 펴 보 겠 습 니 다.
    corePoolSize
    핵심 스 레 드 수(스 레 드 탱크 의 기본 크기)는 스 레 드 탱크 에 작업 을 제출 할 때 스 레 드 를 만들어 작업 을 수행 합 니 다.우리 가 수행 해 야 할 작업 수가 핵심 스 레 드 보다 많 으 면 더 이상 만 들 지 않 습 니 다.prestart AllCoreThreads()측 법 선 스 레 드 탱크 를 호출 하면 모든 기본 스 레 드 를 미리 만 들 수 있 습 니 다.
    maximumPoolSize
    최대 스 레 드 수:스 레 드 탱크 에서 만 들 수 있 는 최대 스 레 드 수 입 니 다.대기 열 이 가득 차 있 고 만 든 스 레 드 수가 최대 스 레 드 보다 적 으 면 스 레 드 탱크 는 새로운 스 레 드 를 만들어 작업 을 수행 합 니 다.여기에 작은 지식 이 있 습 니 다.만약 우리 의 대기 열 이 무한 대기 열 을 사용한다 면 이 매개 변 수 는 작용 하지 않 을 것 입 니 다.왜냐하면 우리 의 임 무 는 계속 대기 열 에 추 가 될 것 이기 때 문 입 니 다.대기 열 은 영원히 채 워 지지 않 을 것 입 니 다.(메모리 가 허용 되 는 경우)
    keepAliveTime
    남 은 스 레 드 최대 생존 시간.현재 스 레 드 수가 핵심 스 레 드 보다 많 을 때 남 은 스 레 드 를 끝내 고 새 작업 을 기다 리 는 가장 긴 시간 입 니 다.기본 적 인 상황 에서 스 레 드 탱크 의 스 레 드 수가 corePoolSize 보다 클 때 만 keepAliveTime 이 역할 을 할 수 있 습 니 다.스 레 드 탱크 의 스 레 드 수가 core PoolSize 보다 크 지 않 습 니 다.즉,스 레 드 탱크 의 스 레 드 수가 corePoolSize 보다 클 때 한 스 레 드 가 남 은 시간 이 keepAliveTime 에 이 르 면 스 레 드 탱크 의 스 레 드 수가 corePoolSize 을 초과 하지 않 을 때 까지 종 료 됩 니 다.
    그러나 allowCoreThreadTimeOut(boolean) 방법 을 호출 하면 온라인 스 레 드 탱크 의 스 레 드 수가 corePoolSize 보다 크 지 않 을 때 keepAliveTime 매개 변수 도 역할 을 하고 스 레 드 탱크 의 스 레 드 수가 0 일 때 까지 역할 을 한다.예 를 들 어 현재 스 레 드 탱크 의 최대 스 레 드 수(maximumPoolSize)는 50 이 고 핵심 스 레 드 수(core PoolSize)는 10 이다.현재 작업 을 하고 있 는 스 레 드 수 는 30 이다.그 다음 에 20 개의 스 레 드 를 비 워 서 일 을 하지 않 았 기 때문에 이 20 개의 스 레 드 는 없어 지고 당 나 귀 를 죽 이 는 느낌 이 든다.
    남 은 30 개의 스 레 드 가 일 을 끝내 고 keepAliveTime 을 이렇게 오래 쉬 었 다 면 이 30 개의 스 레 드 에서 도 20 개 를 소각 하고 핵심 스 레 드 를 유지 해 야 한다.allowCoreThreadTimeOut 을 설치 하면 true 과 같은 핵심 라인 도 폐기 된다.우리 가 아웃 소 싱 프로젝트 를 하 는 것 과 마찬가지 로 갑 의 프로젝트 가 완성 되면 다른 갑 에 가 야 합 니 다.만약 에 짧 은 시간 안에 갑 이 당신 을 받 아들 이지 않 으 면 당신 은 해고 당 할 것 입 니 다.몇 명의 핵심 인원 만 남 겨 두 고 프로젝트 를 지 켜 야 합 니 다.갑 의 프로젝트 를 지 키 면 자신의 사람 을 사용 하면 모든 아웃 소 싱 자 는 해고 당 할 것 입 니 다.
    unit
    스 레 드 생존 시간의 단위.선택 할 수 있 는 단 위 는 days,hours 등 이 있 습 니 다.
    workQueue
    작업 대기 열.다음 대기 열 을 선택 할 수 있 습 니 다.
    threadFactory
    사용자 가 스 레 드 를 만 드 는 공장 을 설정 하면 우 리 는 이 공장 을 통 해 업무 적 의미 가 있 는 스 레 드 이름 을 만 들 수 있 습 니 다.사용자 정의 스 레 드 공장 과 기본 스 레 드 공장 이 만 든 이름 을 비교 할 수 있 습 니 다.
    기본 스 레 드 이름 사용자 정의 스 레 드 공장 이름
    pool-5-thread-1 testPool-1-thread-1
    아 리 개발 매 뉴 얼 도 의미 있 는 스 레 드 이름 을 지정 해 야 한 다 는 점 을 분명히 했다.
    在这里插入图片描述
    ejectedExecutionHandler
    스 레 드 탱크 거부 정책.대기 열과 스 레 드 탱크 가 가득 찼 을 때 스 레 드 탱크 가 포화 상태 에 있다 는 것 을 설명 한다.새로 제출 한 임 무 를 처리 하기 위해 서 는 일정한 전략 을 취해 야 한다.jdk 는 기본적으로 네 가지 거부 정책 을 제공 합 니 다.
    사실 저 희 는 작업 거부 정책(RejectedExecutionHandler 인터페이스 실현)을 사용자 정의 할 수 있 습 니 다.예 를 들 어 작업 이 거부 되면 로 그 를 기록 하거나 다시 시도 하 는 등 자신의 업무 수요 에 따라 이 루어 질 수 있 습 니 다.
    dubbo 작업 거부 정책
    
     @Override
       public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
           String msg = String.format("Thread pool is EXHAUSTED!" +
                   " Thread Name: %s, Pool Size: %d (active: %d, core: %d, max: %d, largest: %d), Task: %d (completed: "
                   + "%d)," +
                   " Executor status:(isShutdown:%s, isTerminated:%s, isTerminating:%s), in %s://%s:%d!",
               threadName, e.getPoolSize(), e.getActiveCount(), e.getCorePoolSize(), e.getMaximumPoolSize(),
               e.getLargestPoolSize(),
               e.getTaskCount(), e.getCompletedTaskCount(), e.isShutdown(), e.isTerminated(), e.isTerminating(),
               url.getProtocol(), url.getIp(), url.getPort());
           logger.warn(msg);
           dumpJStack();
           dispatchThreadPoolExhaustedEvent(msg);
           throw new RejectedExecutionException(msg);
       }//  Java      :756584822      
    
    dubbo 의 거부 정책 은 주로 warm 로 그 를 상세 하 게 기록 하고 현재 스 레 드 스 택 의 상세 한 정 보 를 출력 하 며 거부 작업 이상 을 계속 던 지 는 것 을 알 수 있 습 니 다.
    스 레 드 탱크 매개 변 수 는 어떻게 설정 합 니까?
    스 레 드 탱크 에 이렇게 많은 매개 변수 가 있 는 이상 우 리 는 어떻게 자신의 업무 실제 상황 에 따라 모든 매개 변 수 를 합 리 적 으로 설정 합 니까?
  • 일반적으로 우 리 는 작업 이 시간 이 걸 리 는 IO 형,예 를 들 어 데이터 베 이 스 를 읽 기,파일 읽 기,네트워크 약 통신 등 이 라면 이러한 작업 들 은 cpu 의 자원 을 많이 차지 하지 않 지만 시간 이 걸 릴 것 입 니 다.스 레 드 수 는 2 배 CPU 수 이상으로 설정 하여 CPU 자원 을 충분히 이용 할 수 있 습 니 다.
  • 일반적으로 우 리 는 작업 이 CPU 밀집 형 이 라면 대량의 계산,압축 해제,압축 등 이런 조작 들 이 대량의 cpu 를 차지 할 것 이다.따라서 바늘 은 이 경우 일반적으로 스 레 드 수 를 1 배 cpu+1 로 설정 합 니 다.왜 1 을 추가 해 야 합 니까?백업 스 레 드 라 는 말 이 많 습 니 다.
  • IO 밀집 형 작업 도 있 고 CPU 밀집 형 작업 도 있다 면 스 레 드 크기 를 어떻게 설정 해 야 합 니까?이 경우 스 레 드 탱크 로 나 누 어 처리 하 는 것 이 좋 습 니 다.IO 밀집 은 IO 밀집 형 스 레 드 탱크 로 처리 하고 CPU 밀집 형 은 cpu 밀집 형 으로 처리 하 는 것 이 좋 습 니 다.이상 은 모두 계산 상황 에서 의 추산 일 뿐 진정한 합 리 적 인 파 라 메 터 는 실제 생산 운행 의 효 과 를 보고 합 리 적 으로 조정 해 야 한다.
    모니터링 스 레 드 탱크
    스 레 드 탱크 작업 은 포화 상태 입 니까?라인 의 상황 은 어 떻 습 니까?총 몇 개의 임 무 를 수행 하 였 습 니까?현재 스 레 드 탱크 의 운행 상황 은 어 떻 습 니까?대열 안에 쌓 인 임무 가 있 습 니까?위의 이런 문제 에 직면 하여 스 레 드 탱크 도 우리 가 위의 이런 지 표를 볼 수 있 는 방법 을 제공 할 수 있다.
    이런 매개 변수 가 있 으 면 우 리 는 스 레 드 탱크 의 매개 변 수 를 조정 하 는 것 이 더욱 편리 합 니까?또는 스 레 드 탱크 의 활약 정도 에 따라 스 레 드 탱크 의 인 자 를 자동 으로 조절 합 니 다.
    질문
    스 레 드 탱크 는 핵심 스 레 드 와 비 핵심 스 레 드 를 구분 합 니까?
    어떻게 핵심 라인 이 소각 되 지 않도록 보증 합 니까?
    스 레 드 탱크 의 스 레 드 는 어떻게 재 활용 합 니까?
    총결산
    이 글 은 여기까지 입 니 다.당신 에 게 도움 을 줄 수 있 기 를 바 랍 니 다.또한 당신 이 우리 의 더 많은 내용 에 관심 을 가 져 주 실 수 있 기 를 바 랍 니 다!

    좋은 웹페이지 즐겨찾기