簡體   English   中英

Java線程中斷和連接(連接后線程仍然存在)

[英]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.

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