最近在學習Java8中的CompletableFuture類。想要學習一下多執行緒類,
自己也就嘗試寫了些代碼。不足之處還請有識之士多多指點!
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class Test {
private static final ExecutorService serivce = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
public Test() {
// TODO Auto-generated constructor stub
}
private static List<CompletableFuture<Void>> execFileCopy(String src, String tar) {
List<CompletableFuture<Void>> lst = Collections.synchronizedList(new ArrayList<CompletableFuture<Void>>());
try {
Path target = FileSystems.getDefault().getPath(tar);
Files.walkFileTree(Paths.get(src), new SimpleFileVisitor<Path>() {
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
Objects.requireNonNull(dir);
Objects.requireNonNull(attrs);
Path targetPath = target.resolve(dir.subpath(0, dir.getNameCount()));
Files.createDirectories(targetPath);
return FileVisitResult.CONTINUE;
}
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
Objects.requireNonNull(file);
Path targetPath = target.resolve(file.subpath(0, file.getNameCount()));
lst.add(CompletableFuture.runAsync(() -> {
try {
Files.copy(file, targetPath);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}, serivce));
return FileVisitResult.CONTINUE;
}
});
} catch (IOException e) {
e.printStackTrace();
}
return lst;
}
public static void main(String[] args) throws Exception {
long s = System.currentTimeMillis();
String tar = "E:\\3";
String src = "F:\\angular2"; // 共734M大小目錄 內含386M檔案(1)、185M檔案(1)、其余26,918個檔案均為K級碎片檔案
List<CompletableFuture<Void>> list = execFileCopy(src, tar);
CompletableFuture<Void> controlFuture = CompletableFuture.allOf(list.toArray(new CompletableFuture[]{}));
while(!controlFuture.isDone()) {}
System.out.println("exception found: " + controlFuture.isCompletedExceptionally());
System.out.println((System.currentTimeMillis() - s) / 1000); // 耗時27秒 系統環境(i5-3337U 4G記憶體 256GSSD硬碟 Win10)
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/82188.html
標籤:Java SE
上一篇:學習Java讀取txt檔案資料,轉換為int陣列后,在原資料后面多出了好多個0,有大佬知道怎么回事嗎?。。
下一篇:Source not found for StandardContext.addServletMapping(String, String, boolean)
