gpt4 book ai didi

java - 使用 Runnable 修复 StackOverflowError 递归

转载 作者:行者123 更新时间:2023-11-30 00:31:16 24 4
gpt4 key购买 nike

我在调用此递归方法时收到 StackOverflowError 异常报告:

private void downloadFiles(int index) {
if (index < totalFiles) {
downloadSingleFile(index, new DownloadCallback() {
@Override
public void onSuccess(String filePath) {
downloadFiles(index + 1);
}
});
}
}

我想问一下我是不是这样使用一个Runnable:

int index = 0;
handler = new Handler();
Runnable runnable = new Runnable() {
@Override
public void run() {
downloadFiles();
}
};
handler.post(runnable);

private void downloadFiles() {
if (index < totalFiles) {
downloadSingleFile(index, new DownloadCallback() {
@Override
public void onSuccess(String filePath) {
index ++;
handler.post(runnable);
}
});
}
}

这也会是递归并抛出异常吗?谢谢

最佳答案

您目前对递归的使用有点违背了使用多线程的目的。目前,您只创建一个线程,它将进入 downloadFiles(),然后递归地尝试下载每个可用的文件。这不是真正的多线程,它是带递归的单线程。这种方法有几个缺点。首先,您没有利用多线程并行工作的能力。其次,由于每个后续的递归调用都依赖于前一个成功的递归调用,因此您正在尝试串行下载文件。如果给定的文件下载失败,它将破坏递归链的其余部分。

更好的方法是为每个文件下载生成一个新线程。这将允许您使用多线程的强大功能并行拆分任务,并且即使一个线程遇到一些问题,它也允许继续进行。

查看以下代码 fragment ,了解如何解决您的问题:

public class FileDownloader implements Runnable {
private index;

public FileDownloader(int index) {
this.index = index;
}

public void run() {
downloadSingleFile(index, new DownloadCallback() {
@Override
public void onSuccess(String filePath) {
// this may no longer be needed
}
});
}
}

// use a thread pool of size 5 to handle your file downloads
ExecutorService executor = Executors.newFixedThreadPool(5);
for (int index=0; index < totalFiles; ++index) {
Runnable r = new FileDownloader(index);
executor.execute(r);
}

// shut down the thread pool executor and wait for it to terminate
executor.shutdown();
while (!executor.isTerminated()) {
}

关于java - 使用 Runnable 修复 StackOverflowError 递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44297357/

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