【发布时间】:2016-08-04 16:14:17
【问题描述】:
我正在尝试多线程,并想实现一个小程序来同时下载多个文件。 我创建了一个扩展 Thread 的 FileDownloader 类。
总的来说,我的想法是创建一个包含所有相关 FileDownload 对象 (allDownloads) 的 ArrayList 和另一个名为 activeDownloads 的 ArrayList,我将活动下载的数量限制为 4。
程序下载了几个文件然后抛出这个异常。我知道在尝试再次启动线程时会抛出它。但是在下面的程序中,每次文件下载完成时,我都会中断一个线程并启动另一个线程,所以我不明白,我怎么会尝试启动 SAME Thread?
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****");
}
}
}
感谢您的帮助
【问题讨论】:
-
你能把异常信息放上去吗,在 catch 子句中添加 e.printStackTrace() 这样我们就可以确切地看到发生了什么
-
是的:将 println 放入你的 catch 块中,甚至不打印 e 的消息,这并不比一个空的 catch 块好多少。所以,有些事情失败了,但为什么要说到底...
-
t.isRunning()方法是什么?我不认为它是Threadapi 的一部分。 -
你能把你的FileDownloader类的代码贴出来
标签: java arrays multithreading arraylist download