2013-12-19 38 views
1

在多線程應用程序我有一個線程具有:突圍UDP套接字的接收方法

datagramSocket.receive(packet); 

它等待分組 - 執行被阻塞與接收方法。 同時其他一些線程想關閉這個「等待」線程。

我該如何做到這一點?

目前,我剛剛閉幕導致SocketException拋出的插座,這是我想是不是最好的主意...

任何幫助嗎?

+0

您可以設置超時在'DatagramSocket'或者您也可以向'Thread'發出一箇中斷。 –

+1

這不是一個壞主意 - 它比浪費的,延遲時間超時的解決方案要好。另一種無浪費,無延遲的解決方案是設置'終止'易失性標誌並向UDP線程發送一個空的數據報,所以使receive()調用返回,以便它可以檢查標誌並終止。 –

+0

..或甚至發送一個'請關閉'數據報在你正在使用的任何消息協議。 –

回答

1

自己關閉套接字不是必需的一個壞主意:我們不能說沒有看到上下文,並告訴是否有任何設計錯誤,但我不喜歡它。

另一種方法是把一個循環,檢查一些volatile標誌(因爲它有可能是已經)中的代碼,並設置超時:

while (on) { 
    //... 
    datagramSocket.setSoTimeout(5000); 
    datagramSocket.receive(packet); 
    //... 
} 
+0

代碼幾乎與你輸入的一樣,不同之處在於** SoTimeout **設置爲0.我希望套接字始終打開。在你的情況下,它只能打開5秒鐘。他的問題是,當我甚至將**變量設置爲false時,它不會停止線程,因爲它正在** receive **方法中等待。 –

+0

@Pisek無論你公開一個標誌並設置一個超時,或者你公開實現(套接字和/或線程) – Raffaele

+0

@Pisek套接字在你構建時打開,在你關閉它時關閉。這裏的套接字是*接收*五秒鐘。你的反對意見沒有意義。 – EJP