我已经实现了一个连接检查线程。当我创造了大量的流量时,我意识到有很多" ConnWatchdogThread"实例。 我认为"继续"语句触发中断的线程直播,在这种情况下新的" 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) {
}
}
}
}
答案 0 :(得分:1)
调用线程上的中断方法时发生中断。在你的例子中没有显示正在进行中断的内容。这是an example of using interrupt。
continue
将控制提升到循环的下一次迭代。所以当一些东西在你的线程处于休眠状态时调用中断时,它会退出睡眠状态(清除中断标志),然后继续将它发送回循环的顶部并再次进入休眠状态,这似乎毫无意义。
显示的代码中没有任何内容导致创建新线程。
使用中断退出while循环并导致线程终止更为正常。建议不要使用中断而不是线程取消(Java Concurrency in Practice,7.1,第138页):
API或语言规范中没有任何内容将中断与任何特定的取消语义联系起来,但在实践中,除了取消之外,使用中断是非常脆弱的,并且难以在较大的应用程序中维持。
答案 1 :(得分:0)
创建新主题的唯一方法是使用new Thread(...)
。你的继续导致中断被忽略,并让它再睡一会儿。
中断是一个特殊的标志(但基本上只是一个标志)当你interrupt()
一个线程时,它会导致一些方法抛出InterruptedException,即使它们是阻塞的。一旦触发,标志就会重置。
在代码中忽略异常/错误抛出的esp通常是个坏主意。
答案 2 :(得分:0)
您没有显示使用此类的代码。没办法说出实例是什么。继续不要这样做。实际上可以从ConnWatchdog中的代码中删除第一个try-catch,它会正常工作。
发布调用ConnWatchdog的代码/实例化它以查看完整图片。这是一个循环吗?