gpt4 book ai didi

java - 如何创建海量文件下载线程池并重构当前代码?

转载 作者:行者123 更新时间:2023-12-02 07:35:04 26 4
gpt4 key购买 nike

正如所讨论的。我当前的代码对于操作系统来说太过分了,因为它在单独的线程中运行每个 wget 进程,这很好,但我有近 15k 个文件要下载,所以我想使用线程池来完成这项工作。不幸的是我必须使用 wget 进行下载过程。

    ExecutorService executor = Executors.newFixedThreadPool(5);
for(String filename: files) {
try {
String encodedFilename = URLEncoder.encode(filename, "UTF-8");
final String cmd = "wget --no-check-certificate -O " + filename +" " + BipDownloader.bipUrl + encodedFilename;

Runnable run = new Runnable()
{
public void run() {
try {
System.out.println(cmd);
Process process = Runtime.getRuntime().exec(cmd);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
};
executor.submit(run);
} catch(IOException e) {
System.err.println(e.getMessage());
}
}

编辑

更新了源代码以使用线程池,但我的系统在下载过程中仍然不稳定。

最佳答案

假设您确实需要使用 wget,则可以使用 ExecutorService为您处理线程池:

ExecutorService executor = new FixedThreadPool(100); //pool of 100 threads

...

Runnable r = new Runnable() {

public void run() {
try {
System.out.println(cmd);
Process process = Runtime.getRuntime().exec(cmd);
} catch (IOException e) {
e.printStackTrace();
}
}
}

executor.submit(r);
  • 池的最佳大小取决于多种因素,最好测试多个数字。 100 到 1000 之间应该没问题。
  • 如果您需要监控执行进度,可以存储 executor.submit 返回的 future,或者使用 CompletionExecutorService。

编辑

正如评论中所述,exec 是非阻塞的,因此从理论上讲,即使池的大小有限,所有进程也可能在其中任何一个进程完成之前启动。为了防止这种情况,您应该等到 run 方法中直到进程完成:

Process process = Runtime.getRuntime().exec(cmd);
int exitVal = process.waitFor();

关于java - 如何创建海量文件下载线程池并重构当前代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12368920/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com