2012-12-01 62 views
2

場景Java程序不乾淨地存在。創建殭屍

我有一個Java應用程序(使用Spring集成來偵聽TCP/IP端口)。 我正在用java.util.concurrent.Executors工廠創建的ExecuterService使用一些工作線程。 主線程創建工作線程,並等待在一個循環中像如下

while(!shutdownRequested) 
{ 
    try { 
     Thread.sleep(2000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
} 

我有一個關閉掛鉤其停止執行者服務,並強制關閉在超時的情況。

問題
該程序不能在我的機器上成功終止(Windows 7)。它讓一個線程在tcp端口上偵聽,之後該進程變得不可訪問。 我無法從任務管理器中終止此進程,並獲得「拒絕訪問」錯誤。

有趣的是,這個問題只發生在我的機器上,並不影響任何其他的Windows 7機器。在所有其他機器上,控制檯的Control-C總是能夠成功停止程序。

我在過去遇到過這個問題(使用相同的應用程序),並且在重新格式化和重新安裝Windows之後,問題奇蹟般地消失了。 (我知道這有點太多了!!)

該應用程序完美工作了很多個月,直到不幸的是我不得不再次重新格式化我的電腦最近由於其他原因。重新格式化後,問題又回來了。

這非常令人沮喪,因爲我每次需要重新啓動該應用程序時都需要重新啓動Windows,因爲它無法綁定到該端口上殭屍進程的TCP端口。

任何想法可能是我的設置有問題?

+1

我會確保你有最新的Windows更新,因爲這似乎是一個操作系統錯誤。 –

+1

謝謝彼得的建議,但Windows安裝是與我的公司相同的標準圖像,而其他人並沒有面臨這個問題!我也嘗試更新我的Java到最新版本。 –

回答

1

您可能需要close()這個插座。 這將導致套接字拋出SocketException,並因此停止阻塞。

+0

謝謝,但正如我所提到的,我正在使用Spring Integration(用於特定的TcpInboundGateway)進行通信,並且不直接控制Socket。然而,我已經嘗試調用ctx.stop()和ctx.close()甚至System.exit(0)無濟於事。這裏的ctx意味着Spring應用程序的上下文 –

+0

我想說你需要停止()TcpInboundGateway來強制它關閉套接字。但是,停止背景已經完成了。如果System.exit(0)不起作用,那麼它聽起來像超出了Java中可以做的任何事情,並且這是OS/JVM問題。你可以採取線程轉儲來查看錯誤線程在做什麼。您可以使用jstack或VisualVM來獲取線程轉儲。順便說一句,至少在XP上,你可以使用drwtsn32 -p [pid]殺死一個進程 - 你可以通過在TaskManager上啓用該列來找到該pid。 –