2011-04-11 91 views

回答

7

如果你有一個ServerSocket的參考,你可以調用它的close()方法。這會導致accept()上的線程等待SocketException

請注意,您可能不希望公開對套接字本身的引用;你應該在你的服務器代碼中添加一個名爲shutdownServer()的方法或類似的方法。

1

一般 - 是的,你應該使用Thread.interrupt()和共享變量。在您的特定示例中,您可以關閉套接字以使線程立即返回。閱讀關於它here

+0

'InterruptedException'是一個檢查異常(並且'accept()'沒有聲明它),所以無論中斷線程什麼時候發生,你都不應該期望在調用'ServerSocket.accept()'時捕獲這個線程。我將不得不嘗試查看中斷線程是否有任何影響。我猜想它沒有。 – 2011-04-11 03:24:18

+0

好吧,我試過了,中斷線程不會搶佔對'accept()'的調用,它只是在等待。 – 2011-04-11 03:36:11

+0

......只要他不使用java nio。 – jdigital 2011-04-11 03:37:07

0

您可以設置線程在每次連接後檢查的「停止」變量。然後連接到線程的端口來喚醒它。

另一種方法是通過調用soTimeout()來設置超時,並在每次連接之後和發生超時時檢查「停止」變量。您可能不希望將超時設置得太短。這意味着線程不會立即停止,因此如果需要快速關閉,可能無法爲您工作。

如果可能的話,您也可以直接在ServerSocket上調用close(),如Mark Peters所述。