최근에 A에서 B로 파일을 전송하는 컨트롤러를 구현해야했습니다. 각각 1 ~ 2MB 크기의 파일이 약 8000 개 있습니다.Java에서 ThreadPoolExecutor를 사용하여 동적 파일 전송 컨트롤러 구현
- 하나의 파일 전송이 성공하면 다른 스레드를 만듭니다. (현재 corePooleSize +1 증가)
- 하나의 파일 전송이 실패하면 하나의 스레드 재 시도 전송을 닫습니다 (현재 corePooleSize -1 증가).
- 하나의 파일 전송이 실패하면 특정 시간 동안 다른 스레드를 생성하지 마십시오.
이 문제는 호스트의 제한을 모르고 최대의 연결 수/최적의 전송 속도를 얻는 것입니다.
이제 내 질문은 ThreadPoolExecutor가이 동작을 구현하는 가장 좋은 방법인가 아니면 더 좋은 방법인가?
//Code simplified
//add all files to callables with type Future<Boolean>
while (true) {
// entry = get the first result that's done.
if (entry.getValue().get() == Boolean.TRUE) {
results.remove(entry.getKey());
if (results.size() > threadPool.getCorePoolSize()) {
if (System.currentTimeMillis() >= nextAttempt)
resizeThreadPool(+1);
}
} else {
resizeThreadPool(-1);
nextAttempt = System.currentTimeMillis() + someTimeinMs;
entry.setValue(threadPool.submit(entry.getKey()));
}
if (results.isEmpty())
return true;
}
편집 : 매개 변수로 주어진 스레드의 최소 & 최대 수 있습니다.
완전히 다시 생각해 봐야합니다. '최상의 전송 속도'와 관련이있는 계산에 대해서는 아무 것도 없으므로 엄청난 수의 스레드를 생성하게됩니다. CPU와 네트워크에 대해 서로 경쟁하고 절대적으로 아무 곳에도 도달하지 못하게됩니다. 사용해야하는 최대 스레드 수는 경로 대역폭을 대상 전송 속도로 나눈 값입니다. 이 번호는 다소 작음을 알 수 있습니다. – EJP