파일을 서버에 업로드하는 데 다중 스레드를 사용하고 있습니다. Java 애플릿은 UI를 표시합니다. 처음에는 ThreadPoolExecutor &을 사용하여 5 개의 스레드를 시작하여 5 개의 파일을 할당합니다. 업로드가 끝나면 서버에서 알림을받습니다. 스레드가 실행을 완료하면 모든 파일이 서버에 업로드 될 때까지 새로운 스레드가 파일과 함께 할당됩니다.ThreadPoolExecutor 구현 문제
기본 코드 구조를 다음과 같이
I> 업로드 기능을 처리하기위한 책임이있는 자바 애플릿에서 호출되는 방법 startUpload는().
class Upload extends Runnable{
...............................
..............................
public void startUpload() {
............................... //other initialisations done
int waitTime = 500;
Random random = new Random();
ExecutorService executor = new ThreadPoolExecutor(5, 5, 50000L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(300));
while (it.hasNext()) {
int time = random.nextInt(1000);
waitTime += time;
newFile = new File((String) it.next());
executor.execute(new Runnable() {
@Override
public void run() {
try{
Thread.sleep(wait);
}
catch(Exception e){
}
processFile1(newFile);
}
});
}
try {
Thread.sleep(waitTime);
executor.shutdown();
executor.awaitTermination(waitTime, TimeUnit.MILLISECONDS);
} catch (Exception e) {
}
}
}
나는 현재 직면하고 문제.
i> UI는 모든 파일을 업로드 할 때만 업데이트됩니다. 중간 단계에서 UI는 매달린 상태에 있습니다. EDT가 막힌 상태로가는 것 같습니다.
같은 기능을 구현하기 위해 스레드 클래스, 알림/절전 모드를 사용할 때 UI 렌더링과 동일한 코드가 제대로 작동했습니다. 나는 블로그/기사에서 자바 버젼 5.0에서 멀티 쓰레딩을 구현하는 더 좋은 방법을 보았 기 때문에 코드를 ThreadPoolExecutor로 바꿨다.
ii> 위의 코드에서 wait()를 모두 제거하면 size 1KB (테스트 용) 인 여러 파일을 업로드 할 때 ThreadPoolExecutor에서 알아챈 또 다른 점은 다음 줄에서 새 파일이 할당됩니다 동일한 파일은 항상 여러 스레드에 의해 항상 업로드됩니다.
newFile = new File ((String) it.next());
그러나 run()을 사용하여 sleep()을 추가하면 여러 스레드가 다른 파일을 서버에 업로드합니다.
위의 코드에 구현 문제가 있습니까?
답장을 보내 주셔서 감사합니다. 나는 File을 Final & Local 변수로 변경했다. 내가 얻는 문제는 두 번 스레드가 같은 파일을 업로드하려고 시도하는 경우 (3 번 중 한 번)입니다. 문제는 기본적으로 스레드 동기화입니다. 서버 로그에서 두 개의 스레드가 동일한 파일을 업로드하려고 시도 했으므로 중복 요청이 있음을 알게되었습니다. 그것에 관한 어떤 제안? – chiranjib
@chiranjib 내가 제안한 변화를 시험해 보라. newFile이 내 코드 에서처럼 로컬 변수라면 executor는 올바른 값을 얻을 것이다. executor가'newFile'에 액세스 할 때를 알 수 없으므로 메인 스레드가 그것을 갱신 할 때마다 동일하거나 다른 파일을 얻을 수 있습니다. – Bringer128