gpt4 book ai didi

Java线程中断并加入(加入后线程还活着)

转载 作者:行者123 更新时间:2023-11-30 12:00:10 24 4
gpt4 key购买 nike

我正在尝试找出一些行为。我有一些生成一个线程的代码。它等待一段时间,然后中断它,加入它,然后退出该方法。

.
.
.
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)时中断了线程,并且它花费的时间比命中 while 条件和完成连接所花费的时间还多。

所以我的问题是,线程发生了什么?

它不再被引用并且线程可以被垃圾收集,但是没有一个资源被正确清理,这看起来很糟糕。除了切换到 NIO 之外,还有更好的模式吗?

最佳答案

interrupt() 只是在线程上设置一个标志,表明它已被中断。当这种情况发生时,许多阻塞调用不会解除阻塞,这意味着线程几乎不受中断的影响并继续做它的事情(例如,在 InputStream 上阻塞)。

我猜在某些情况下,线程不会解除阻塞并在给定的连接超时(此处为 1 秒)内达到您的 while 条件,在其他情况下,阻塞调用恰好在超时内完成并且线程结束。

只要一个线程在运行,它仍然会有一个引用并且不会被垃圾回收。如果阻塞调用永远不会解除阻塞 - 如果它从例如读取时可能会发生这种情况一个死掉的 TCP 套接字的另一端已经悄无声息地消失了,线程可能永远不会结束。

关于Java线程中断并加入(加入后线程还活着),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2163279/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com