2015-05-06 125 views
1

我有一個WatchService拋出了下面的代碼ClosedWatchServiceException如何在應用程序關閉時終止WatchService?

final WatchService watchService = FileSystems.getDefault().newWatchService(); 

Runtime.getRuntime().addShutdownHook(new Thread() { 
    public void run() { 
     try { 
      watchService.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
}); 

WatchKey key = null; 
while (true) { 
    key = watchService.take(); //throws ClosedWatchServiceException 
    //execution 
} 

我怎樣才能安全地關閉該服務沒有得到例外呢?或者我應該忽略關閉,因爲任何線程在終止應用程序時都會被終止?

回答

3

首先說明你的代碼沒有什麼錯。您只需在關機期間適當地處理ClosedWatchServiceException。這是因爲在執行jvm關機期間,執行watchService.take()的線程在該操作中被阻塞。因此,一旦手錶服務關閉,屏蔽的線程將被解除阻塞。

您可以通過在致電watchService.close()之前中斷正在運行watchService.take()的線程來阻止此操作。這應該給你一個InterruptedException,你可以處理。但take的合同並沒有說明在拋出異常時要考慮的事件的順序。所以你仍然可以結束ClosedWatchServiceException

所以你可以有一個易失性標誌來指示應用程序關閉。在獲得ClosedWatchServiceException後,您可以評估該標誌,然後優雅地退出(如果該標誌已設置)。

相關問題