자바 에서 다 중 스 레 드 로 그림 을 다운로드 하고 압축 하면 효율 을 높 일 수 있 습 니까?

머리말
엑셀 내 보 내기:그 자체 가 간단 한 내 보 내기 라 고 생각 하지만 각 줄 의 기록 파일 중 하 나 는 그림 url 입 니 다.모든 기록 줄 에 해당 하 는 그림 을 다운로드 한 다음 전체 폴 더 를 압축 해 야 합 니 다.

여 기 는 4.5.코드 설명 만 하고 다른 것 도 할 말 이 없고 코드 를 더 말 하지 않 습 니 다.
사고의 방향 을 실현 하 다.
다 중 스 레 드 는 스 레 드 탱크,Jdk 1.8 를 사용 하고 가방 에 있 는 Complete bleFuture 를 사용 합 니 다.
STEP 1:기본 수치 획득

        //    
        Integer threadNum = 10;
        //               
        int dataNum = imageInfoVos.size() / threadNum;
        //      
        List<Integer> threadS = new ArrayList<>();
        for(int i=0; i<threadNum; i++){
                threadS.add(i);
        }
우선 다운로드 해 야 할 그림 의 Url 목록 을 저 장 했 습 니 다.다 중 스 레 드 방식 으로 다운로드 하려 면 모든 스 레 드 에서 다운로드 한 그림 이 중복 되 지 않도록 해 야 합 니 다.따라서 우 리 는 규칙 에 따라 Url 목록 을 저장 하 는 집합 을 절단 하여 모든 스 레 드 가 자신의 임 무 를 다운로드 하고 코드 를 다운로드 하도록 해 야 합 니 다.

 //      
 threadS.stream().map(item -> CompletableFuture.runAsync(() ->{
                List<Image> theadItem = imageInfoVos.subList(dataNum * item,(item+1)==threadNum?imageInfoVos.size():Math.min(dataNum * (item + 1 ), imageInfoVos.size()));
                        threadDownPic(theadItem,item,dirName);
            },threadPoolTaskExecutor)).collect(Collectors.toList()).forEach(item ->{
                try {
                    item.get();
                }catch (Exception e){
                    log.error("============     down       msg:{} =============", e.getMessage());
                }
    });
여기 서 분할 설명 을 하 겠 습 니 다.
Complete bleFuture.runAsync 비동기 방식 으로 item 옮 겨 다 니 기
예 를 들 어 item=10,즉 스 레 드 수가 10 이면 10 회 를 직접 실행 합 니 다.

 //   CompletableFuture.runAsync      ,  item
 //  item=10,       10,     10 (        )
 threadS.stream().map(item -> CompletableFuture.runAsync(() ->{
item 수치 에 따라 sublist 를 통 해 시작 부터 끝까지 해당 스 레 드 에 필요 한 다운로드 Url 목록 을 캡 처 합 니 다.
예:dataNum 은 모든 스 레 드 에 필요 한 다운로드 수 입 니 다.
예 를 들 어:item=0 dataNum*item(0)=0,Math.min(dataNum*(item+1)=100
(item+1)==threadNum?image InfoVos.size()이번 에는 마지막 스 레 드 처리 가 마지막 으로 부족 한 그림 을 확보 하기 위해 서 입 니 다.
위의 규칙 에 따라 모든 스 레 드 에서 다운로드 해 야 할 그림 을 얻 을 수 있 습 니 다.

   //   item    sublist       ,            Url  
   //  :dataNum                 dataNum 100 
   //  :item=0 dataNum* item(0) =0,Math.min(dataNum * (item + 1 )=100
   //                      Url      
   // (item+1)==threadNum?imageInfoVos.size()                       
   List<ImageInfoVo> theadItem = imageInfoVos.subList(dataNum * item,(item+1)==threadNum?imageInfoVos.size():Math.min(dataNum * (item + 1 ), imageInfoVos.size()));
   // theadItem:  Url  item:      dirName:    url
   threadDownPic(theadItem,item,dirName);
실행 되 는 비동기 방식 으로 인해 여 기 는 스 레 드 탱크 의 모든 스 레 드 가 끝나 야 아래로 내 려 갈 수 있 습 니 다.압축 파일 절 차 를 실행 합 니 다.여기에 스 레 드 탱크 를 수 동 으로 부여 하지 않 으 면 CompletableFuture 는 기본적으로 ForkJoinPool.comonPool 을 사용 하여 컴퓨터 핵심 수 에 따라 지정 합 니 다.
예 를 들 어 본 컴퓨터 가 지정 하지 않 은 것 은 7 개의 스 레 드 입 니 다.방법 을 실행 할 때 앞의 7 개의 스 레 드 임 무 를 수행 해 야 3 개의 스 레 드 를 계속 만 들 고 후속 미 완성 을 계속 수행 할 수 있 습 니 다.

   },threadPoolTaskExecutor)).collect(Collectors.toList()).forEach(item ->{
                try {
                    item.get();
                }catch (Exception e){
                    log.error("============     down       msg:{} =============", e.getMessage());
                }
            });
실측
주요 코드 도 다 썼 는데 이런 방식 이 정말 효율 을 높 일 수 있 습 니까?다음은 제 가 테스트 그림 을 몇 장 붙 여서 설명 하 겠 습 니 다.

사실 이런 방식 은 효율 을 현저히 향상 시 키 지 못 했다.물론 이것 은 내 가 본 기계 환경 에서 테스트 한 것 이다.
효율 은 네트워크 속도 에 의 해 결정 되 는 것 이지 이 컴퓨터 의 Cpu 와 io 에 의 해 결정 되 는 것 이 아니다.예 를 들 어 10M 대역 폭,한 스 레 드 는 한 순서 로 다운로드 되 지만 속 도 는 10M,10 개의 스 레 드 이 고 모든 스 레 드 의 속 도 는 1M 일 수 있 으 며 결 과 는 다 르 지 않다.
네트워크 속도 에 비해 다 중 스 레 드 가 가 져 온 cpu 와 io 가 절약 하 는 시간 은 거의 무시 할 수 있 습 니 다.병목 은 네트워크 속도 입 니 다.
자바 의 다 중 스 레 드 에서 그림 을 다운로드 하고 압축 하면 효율 을 높 일 수 있 는 지 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바 다 중 스 레 드 다운로드 효율 성 향상 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기