2011-04-11 94 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所述。