如何以及为什么在过载的流量下中断线程

时间:2014-11-04 13:32:13

标签: java multithreading interruption

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

            }

         }

      }
   }

3 个答案:

答案 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的代码/实例化它以查看完整图片。这是一个循环吗?