gpt4 book ai didi

java - 下载多个文件时线程 IllegalThreadStateException

转载 作者:行者123 更新时间:2023-11-30 07:13:41 26 4
gpt4 key购买 nike

我正在尝试多线程,想要实现一个小程序来同时下载多个文件。我创建了一个扩展 Thread 的 FileDownloader 类。

总的来说,我的想法是创建一个包含所有相关 FileDownload 对象 (allDownloads) 的 ArrayList 和另一个名为 activeDownloads 的 ArrayList,其中我将 Activity 下载的数量限制为 4。

程序下载了一些文件,然后抛出此异常。我知道当尝试再次启动线程时会抛出它。但在下面的程序中,每次文件下载完成时,我都会中断一个线程并启动另一个线程,所以我不明白,我怎么可能尝试启动同一个线程?

while (allDownloads.size() > 0) {
while (activeDownloads.size() < 4) {
if (allDownloads.iterator().hasNext()) {
FileDownloader d = allDownloads.iterator().next();
activeDownloads.add(d);
allDownloads.remove(d);

}
}
for (int i = 0; i < activeDownloads.size(); i++) {
FileDownloader t = activeDownloads.get(i);
try {
if (!t.isRunning())
t.start();
else if (t.isFinished()) {
t.interrupt();
activeDownloads.remove(t);
}
} catch (IllegalThreadStateException e) {
System.out.println("****Thread cannot be restarted****");
}
}

}

感谢您的帮助

最佳答案

您的错误可能就在这里:

if (allDownloads.iterator().hasNext()) {
FileDownloader d = allDownloads.iterator().next();
...
}

您应该将 allDownloads.iterator() 的值保留在专用变量中,否则您将在每次调用时创建一个新的迭代器,然后始终获取第一个值,因此这里是同一个线程。

所以代码应该是:

Iterator<FileDownloader> it = allDownloads.iterator();
while (activeDownloads.size() < 4) {
if (it.hasNext()) {
FileDownloader d = it.next();
activeDownloads.add(d);
it.remove();

}
}

关于java - 下载多个文件时线程 IllegalThreadStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38772523/

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