Java 线程在过载流量下如何中断以及为什么中断
我已经实现了一个连接检查线程。当我创建了大量的流量时,我意识到有很多“ConnWatchdogThread”实例。 我认为“continue”语句会触发中断的实时线程,在这种情况下会创建新的“ConnWatchdogThread”。如果是这样,这是怎么发生的?线程是如何中断的Java 线程在过载流量下如何中断以及为什么中断,java,multithreading,interruption,Java,Multithreading,Interruption,我已经实现了一个连接检查线程。当我创建了大量的流量时,我意识到有很多“ConnWatchdogThread”实例。 我认为“continue”语句会触发中断的实时线程,在这种情况下会创建新的“ConnWatchdogThread”。如果是这样,这是怎么发生的?线程是如何中断的 private class ConnWatchdog extends Thread { public ConnWatchdog(){ setName("ConnWatchdogThread"); }
private class ConnWatchdog extends Thread {
public ConnWatchdog(){
setName("ConnWatchdogThread");
}
private void checkConnections() {
//connection check
}
@Override
public void run() {
while (true) {
try {
Thread.sleep(checkPeriod);
} catch (InterruptedException e) {
// e.prinstackTrace()
continue;
}
try {
this.checkConnections();
} catch (Throwable t) {
}
}
}
}
创建新线程的唯一方法是使用
新线程(…)
。您的continue导致中断被忽略,使其睡眠时间延长一点
中断是一个特殊的标志(但基本上仍然只是一个标志),当你Interrupt()
线程时,它会导致一些方法抛出InterruptedException,即使它们正在阻塞。一旦触发,标志将重置
通常,忽略esp在工作不正常的代码中抛出的异常/错误是一个坏主意。当调用线程上的中断方法时,会发生中断。在您的示例中没有显示是什么造成了中断。给你
continue
将控制推进循环的下一次迭代。因此,当某个线程在睡眠时调用中断时,它会退出睡眠状态(清除中断标志),然后continue将其发送回循环的顶部,然后它再次进入睡眠状态,这似乎毫无意义
显示的代码中没有任何内容会导致创建新线程
使用中断退出while循环并导致线程终止会更正常。不建议对线程取消以外的事情使用中断(Java并发实践,7.1,第138页):
API或语言规范中没有任何东西将中断与任何特定的取消语义联系起来,但是在实践中,将中断用于除取消之外的任何东西都是脆弱的,并且在更大的应用程序中很难维持
您没有显示使用此类的代码。没有办法说是什么造成了这些例子。继续下去不行。事实上,您可以在ConnWatchdog first try catch中从代码中删除continue,这样就可以正常工作 发布调用ConnWatchdog/实例化它的代码,以查看完整图片。这是一个循环吗