Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我只能';t杀死Java线程_Java_Multithreading_Kill - Fatal编程技术网

我只能';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多个线程处于死锁状态,因为你刚刚杀死的线程在持有锁的钥匙时被烧掉了,因为对象处于不一致的状态,没有人能再释放它。