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) {

            }

         }

      }
   }
4

3 回答 3

1

调用线程上的中断方法时会发生中断。您的示例中没有显示中断的原因。这是一个使用中断的例子

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

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

使用中断退出while循环并导致线程终止会更正常。不建议对线程取消以外的事物使用中断(Java Concurrency in Practice,7.1,第 138 页):

API 或语言规范中没有任何内容将中断与任何特定的取消语义联系起来,但在实践中,将中断用于除取消之外的任何事情都是脆弱的,并且难以在大型应用程序中维持。

于 2014-11-04T14:03:23.593 回答
0

创建新线程的唯一方法是使用new Thread(...). 您的 continue 导致中断被忽略并使其睡眠时间更长。

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

忽略运行不正常的代码中抛出的异常/错误通常是一个坏主意。

于 2014-11-04T13:55:06.973 回答
0

您没有显示使用此类的代码。没有办法说是什么在制作实例。继续不会做。事实上,可以在 ConnWatchdog 中从您的代码中删除 continue ,首先 try-catch 并且它会正常工作。

发布调用 ConnWatchdog / 实例化它的代码以查看全貌。这是在循环吗?

于 2014-11-04T14:28:31.007 回答