作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试找出一些行为。我有一些生成一个线程的代码。它等待一段时间,然后中断它,加入它,然后退出该方法。
.
.
.
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/
我是一名优秀的程序员,十分优秀!