2014-11-04 102 views
0

我已经实现了连接检查线程。当我创建了大量的流量时,我意识到有很多“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) { 

      } 

     } 

     } 
    } 

回答

1

调用线程上的中断方法时发生中断。在你的例子中没有显示什么是中断。这里是an example of using interrupt

continue将控制权提前到循环的下一次迭代。因此,当线程在睡眠中调用中断时,它将退出睡眠状态(清除中断标志),然后继续将其发送回循环顶部,然后再次进入休眠状态,这似乎毫无意义。

显示的代码中没有任何内容会导致创建新的线程。

使用中断退出while循环并导致线程终止将更为正常。使用比线程取消其他的事情中断,不推荐(Java并发实践,7.1,第138页):

有没有什么是关系中断任何特定的取消语义的API或语言规范,但在练习,使用中断任何东西,但取消在大型应用程序中很脆弱并且难以维持。

0

创建新线程的唯一方法是使用new Thread(...)。你的继续导致中断被忽略,并让它睡得更久。

中断是一个特殊的标志(但基本上仍然只是一个标志)当你线程interrupt()一个线程它会导致一些方法抛出InterruptedException即使他们阻止。一旦触发标志被重置。

通常是一个坏主意,忽略异常/错误抛出esp代码中不完美的工作。

0

您没有显示使用此类的代码。没办法说什么是做实例。继续不会做。事实上,可以从ConnWatchdog的第一次尝试抓取代码中删除继续,它会工作得很好。

发布您的代码,调用ConnWatchdog /实例化它看到完整的图片。这是在一个循环?

相关问题