[英]Java thread interrupts and joins (thread is still alive after join)
我正在嘗試找出一些行為。 我有一些生成一個線程的代碼。 它等待一段時間,然后中斷它,加入它,然后退出該方法。
.
.
.
try {
Thread.sleep(processForMillis);
}
catch (InterruptedException ex) {
// Won't happen, ignore.
}
for (Thread t : threads) {
logger.debug("Interrupting Thread " + t.getName());
t.interrupt();
}
for (Thread t : threads) {
try {
t.join(1000L);
logger.debug("Joined Thread " + t.getName());
logger.debug("isAlive? " + t.isAlive());
}
catch (InterruptedException ex) {
// this will never happen
logger.debug("InterruptionException while joining, but didn't expect it.");
}
}
} // end of method
我目前僅使用一個線程運行此程序。 我在日志中可以看到,通常,加入后isAlive()將為false,但有時它仍處於活動狀態。 線程處於while循環中:
while(!Thread.currentThread().isInterrupted()){
.
// do some blocking io stuff here
}
因此,我懷疑正在發生的事情是,我們在讀取/處理輸入流時阻塞了線程(阻塞io),花費的時間超過了有條件觸發並完成連接所花費的時間。
所以我的問題是,線程發生了什么?
它不再被引用,線程可以被垃圾回收,但是沒有正確清理所有資源,這似乎很糟糕。 除了切換到NIO,還有更好的模式嗎?
interrupt()只是在已被中斷的線程上設置一個標志。 發生這種情況時,許多阻塞調用不會解除阻塞,這意味着線程幾乎不受中斷的影響,並繼續執行其工作(例如,在InputStream上進行阻塞)。
我猜在某些情況下線程不會取消阻塞並在給定的連接超時(此處為1秒)內達到您的while條件,在其他情況下,阻塞調用恰好在超時內完成並且線程結束。
只要線程正在運行,它仍將具有引用,並且不會被垃圾收集。 如果阻塞調用永遠不會解除阻塞-如果它從死掉的tcp套接字讀取消息,而另一端已經消失,則該線程可能永遠不會結束。
除了“否”的答案,要中斷阻塞的IO調用,您可以close()
其流
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.