자바 에서 다 중 스 레 드 로 그림 을 다운로드 하고 압축 하면 효율 을 높 일 수 있 습 니까?
엑셀 내 보 내기:그 자체 가 간단 한 내 보 내기 라 고 생각 하지만 각 줄 의 기록 파일 중 하 나 는 그림 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 가 절약 하 는 시간 은 거의 무시 할 수 있 습 니 다.병목 은 네트워크 속도 입 니 다.
자바 의 다 중 스 레 드 에서 그림 을 다운로드 하고 압축 하면 효율 을 높 일 수 있 는 지 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바 다 중 스 레 드 다운로드 효율 성 향상 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.