Java 선물을 처음 사용하려고합니다. 일부 파일의 압축을 풀도록 클래스를 설정했습니다. 재귀 적으로 압축을 풀고 싶습니다. 왜냐하면 zip 파일을 포함하고있는 zip 파일이 있기 때문입니다.Java 선물을 사용하여 스레드 안전 수집 작업을 수행합니다.
나는 드라이브 클래스를 사용하여 호출 가능을 구현하는 Uncompressor 클래스를 인스턴스화합니다. Uncompressor는 압축이 풀리기 시작하고, 다른 .zip을 가로 지르면 자체 인스턴스를 생성하고 풀에 추가 한 다음 계속합니다. 여기 사이비 코드
From DriverClass:
.
.
.
ExecutorService pool = new Executors.newFixedThreadPool(4);
Uncompressor uc = new Uncompressor(pool, compressedFile);
Collection<File> files = uc.uncompress();
for(Future <Collection<File>> f : uc.futures)
files.addAll(f.get());
// at the end of this loop, files doesnt seem to hold all of my files
그리고
내 uncompressor 클래스
public class Uncompressor implements Callable<Collection<File>>
{
public Set<Future<Collection<File>>> futures = new HashSet<Future<Collection<File>>>();
File compressedFile;
public Uncompressor(ExecutorService pool, File compressedFile)
{
this.pool = pool;
this.compressedFile = compressedFile;
}
public Collection<File> call() throws Exception[
return uncompress();
}
public Collection<File> uncompress()
{
List<File> uncompressedFiles = new ArrayList<File>();
.
.Loop
.//Try to uncompress the file. If the archive entry is a zip file, do the following:
Callable<Collection<File>> callable = new Uncompressor(this.pool, archiveFileEntry);
Future f = pool.submit(callable);
futures.add(f);
//else, add files to a collection here for returning
uncompressedFiles.add(archiveFileEntry);
.EndLoop
return uncompressedFiles;
.
.
}
그래서 문제가, 내 DriverClass에있는 재귀에서 압축되지 않은 파일을 모두 보유해야하는 파일의 내 컬렉션 여기에 다이빙은 그 안에 모든 파일을 가지고있는 것 같습니다. 나는 미래로부터의 반환 가치를 얻는 것에 뭔가 잘못하고 있다고 생각한다. 클래스 멤버 변수 futures
이 정의 된 방식 때문입니까?
예, 가능합니다. 그것은 zip 내의 모든 zip 번호 일 수 있습니다. 실제로는 – Derek