簡體   English   中英

我只是無法殺死Java線程

[英]I just can't kill Java thread

我有一個線程,使用不同的代理從Internet下載一些圖像。 有時會掛起,不能以任何方式殺死。

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() 該方法也掛起並與它一起,主線程。 我試過in.close() 沒有效果。 我試過uc=nullin=null希望有一個異常將結束線程。 它一直在運行。 它永遠不會傳遞uc.getInputStream()方法。

在我的上一次測試中,線程在收到所有上述命令(或各種組合)后持續超過14小時。 我不得不殺死Java進程來阻止線程。

如果我只是忽略該線程,並將其實例設置為null,則該線程不會死亡並且不會被垃圾收集器清除。 我知道,因為如果我讓應用程序運行了幾天,那么Java進程會占用越來越多的系統內存。 在3天內,我的8Gb系統RAM占了10%。

什么都不可能殺死一個線程?

什么都不可能殺死一個線程?

在許多情況下,是的 - 尤其是當線程在不可中斷的IO上被阻止時。 您可以通過從另一個線程調用uc.getInputStream().close()來取消阻止它。 雖然這可能不是線程安全的。 HttpUrlConnection也有一個你應該在你的情況下設置的setReadTimeout ()。

嘗試設置uc.setReadTimeout(30000);

除了設置讀取超時(在其他回復中提到),您是否嘗試中斷線程?

不,你不能。 從外部殺死一個線程本質上是不安全的操作。

你能做的就是讓線程自願關閉。 編寫下載線程,以便在超過超時時自行終止。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM