以下线程处于循环中,它只是连接到服务器,下载文件,关闭连接然后重复该过程。 在循环的大约500次迭代之后抛出以下异常 -
java.net.ConnectException:Connection 超时:连接
为什么会发生这种情况? 一旦抛出异常,有没有办法杀死线程?
代码 -
public void run() {
boolean isExceptionThrown = false;
try {
while(true){
URL url = new URL(urlString);
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
{
//do nothing, just want to read the file
}
in.close();
++counter;
System.out.println("Thread id : "+this.threadId+" Connection number : "+counter +" URL : "+urlString);
}
}
catch(Exception e){
e.printStackTrace();
}
}
感谢。
答案 0 :(得分:2)
问题在于,您绝不允许您与完全关联Reader
一次,并让线程为下一个while
循环释放资源:
线程池中可能有太多连接创建另一个1(而其他人试图关闭)会创建超时(这是我的猜测)。
改为执行此操作(伪java代码):
while (true) {
BufferedReader in = null;
try {
} catch (Exception e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (Exception ignore) {
ignore.printStackTrace();
}
}
in = null;
}
}
此外,在完全没有活动之前,让你的线程有时间“清理”自己。尝试sleep
/等待线程完全关闭连接并释放其资源。
答案 1 :(得分:1)
当计数== 400时,尝试输入类似睡眠的东西10秒,看看这对你能处理的数量有什么影响吗?
答案 2 :(得分:1)
可能是服务器被太多连接淹没了。即使关闭流,服务器也可能需要一些时间来关闭套接字。
一旦抛出异常,您所拥有的代码将退出循环,因为catch
块在while (true)
块之外。一旦run
返回,线程将会死亡。
答案 3 :(得分:0)
首先,我认为线程将在打印堆栈跟踪后退出,因此您应该杀死该线程。
关于原因,您的问题中没有足够的信息来找出真正的问题。我认为您还应该检查服务器端,以检查永远下载相同的文件是否不会引起服务器端的问题或触发保护措施。
您希望确保可以使用Wireshark之类的内容来检查客户端和服务器之间的网络活动。您可能会注意到,在最后一个连接上,您将看到出站数据包,但不会看到入站数据包。