2014-11-04 47 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 /實例化它看到完整的圖片。這是在一個循環?

相關問題