2011-12-06 72 views
3

我想以編程方式殺死一個在while(true)循環中運行並監聽無限連接的線程,並且由於監聽是一種阻塞方法,所以我不能簡單地將循環statemenet設置爲false。我的應用程序通常在連接啓動服務器以偵聽連接時定期交換網絡,因此當它切換到另一個網絡時,我擔心舊服務器會變成殭屍,並且只是停留在那裏,因爲在新網絡上服務器綁定與之前的IP不同。如何以編程方式在連續偵聽新連接時終止服務器線程?

PS。將服務器綁定到localhost不需要在網絡更改後重置?

+0

我建議的第一件事是重構你的代碼到非阻塞調用,如果這可能在你的語言(順便說一句,你沒有提及哪一個)。然後,你可以打破循環...編輯:對不起,我剛剛注意到它是在Java類別。 –

+0

@NoICE語言是在標籤,JAVA :),如何重構一個方法,如socket.accept()?這甚至有可能嗎? – Miky

+0

Ruby有IO.select調用,而不是接受..我敢打賭,java有一些其他的方法來做到這一點...只是谷歌「Java非阻塞io」(或套接字)(我想幫助更多,但我是java的初學者) –

回答

4

如果您需要能夠停止坐在accept循環中的線程,則可以撥打setSoTimeout,以便accept調用可以在不等待實際連接發生的情況下完成。

請注意,如果您綁定到所有接口,則可能不需要在將新網絡接口添加到系統時創建新套接字。

其他可能性是在線程上呼叫close或線程上的stopinterrupt。如果您可以使用異步I/O,請參見http://www.developer.com/java/article.php/3837316/Non-Blocking-IO-Made-Possible-in-Java.htm

0

您是否谷歌的問題?關於如何停止代碼中的線程有很多。

Sun的文檔中有你所需要的是什麼:

http://docs.oracle.com/javase/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.html

這裏還有一個相關的問題在那裏我得到這個來自:

How do you kill a thread in Java?

請在問問題之前,所以環顧四周。

+0

是的我在發佈之前已經做了一些研究,我的問題不像殺死一個線程那麼簡單,因爲在我的情況下它很可能會變成殭屍進程。 – Miky

1

只需關閉ServerSocketChannel,調用accept()的線程將拋出AsynchronousCloseException或ClosedChannelException。

另一種可能性是中斷線程。根據JDK文檔,它應該在調用accept()時拋出ClosedByInterruptException,從而關閉通道。但是,根據我的經驗,ClosedByInterruptException並不總是可靠,某些JDK版本中存在已知的錯誤。

相關問題