我只能';t杀死Java线程
我有一个线程,使用不同的代理从互联网下载一些图像。 有时它会挂起来,无论如何也杀不了它我只能';t杀死Java线程,java,multithreading,kill,Java,Multithreading,Kill,我有一个线程,使用不同的代理从互联网下载一些图像。 有时它会挂起来,无论如何也杀不了它 public HttpURLConnection uc; public InputStream in; Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("server", 8080)); URL url = new URL("http://images.com/image.jpg"); uc = (HttpURLConnectio
public HttpURLConnection uc;
public InputStream in;
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("server", 8080));
URL url = new URL("http://images.com/image.jpg");
uc = (HttpURLConnection)url.openConnection(proxy);
uc.setConnectTimeout(30000);
uc.setAllowUserInteraction(false);
uc.setDoOutput(true);
uc.addRequestProperty("User-Agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)");
uc.connect();
in = uc.getInputStream();
当它挂起时,它在uc.getInputStream()
方法处冻结。
我制作了一个计时器,如果线程的运行时间超过3分钟,它会试图终止线程。
我尝试了.terminate()
线程。没有效果。
我尝试从主线程断开uc.disconnect()。该方法还挂起主线程。
我在.close()中尝试了
。没有效果。
我尝试了uc=null
,in=null
,希望出现异常,结束线程。它一直在运行。
它从不传递uc.getInputStream()
方法
在我的上一次测试中,线程在收到上述所有命令(或各种组合)后持续了14个多小时。我不得不终止Java进程来停止线程
如果我忽略该线程,并将其实例设置为null,则该线程不会死亡,也不会被垃圾收集器清除。我知道这一点,因为如果让应用程序运行几天,Java进程将占用越来越多的系统内存。在3天内,它占用了我8Gb系统内存的10%
无论如何都不可能终止线程?尝试设置
uc.setReadTimeout(30000)代码>
要杀死一根线是不可能的
在许多情况下,是的-特别是当线程在不可中断IO上被阻塞时。
您可以通过从另一个线程调用uc.getInputStream().close()
来取消阻止它。尽管这可能不是线程安全的。HttpUrlConnection还有一个()您可能应该在您的案例中设置。不,您不能。从外部终止线程本质上是不安全的操作
你能做的就是让线程自动关闭自己。写入下载线程,使其在超过超时时自行终止 在设置读取超时(在其他回复中提到)的同时,您是否尝试中断线程 我想这样做,但线程挂起在一个API函数上。线程冻结后,我在线程内部没有控制权(我不能说“do{}while(alive==true)”并随时设置alive=false,因为由于API方法冻结,while行永远不会执行);它将从任何卡住的地方触发java.io.InterruptedIOException
,并且getInputStream
被记录为能够抛出这类东西。(好吧,这是一个超类。)打开调试器时,你必须在脖子上戴上一点大蒜,在四周洒上圣水,然后用一块木牛排敲打整个过程的心脏,最后,切掉它的头并烧掉剩下的部分。这是唯一可以确定的方法。(当然,也可以从轨道上进行核爆。)@Jeffrey L Whitledge:是的,这样做之后,你发现自己又有20多个线程处于死锁状态,因为你刚刚杀死的线程在持有锁的钥匙时被烧掉了,因为对象处于不一致的状态,没有人能再释放它。