如何中断ServerSocket accept()方法?

问题

在我的主线程中,我有一个awhile(listening)loop,它调用我的ServerSocket对象的accept(),然后启动一个新的客户端线程,并在接受新客户端时将其添加到Collection。

我还有一个Admin线程,我想用它来发出命令,比如'exit',这将导致所有客户端线程被关闭,自行关闭,并关闭主线程,通过转向监听false。

但是,accept()调用了while(listening)loop块,并且似乎没有任何方法可以中断它,所以while条件无法再次检查而程序无法退出!

有一个更好的方法吗?或者某种方式来中断阻塞方法?


#1 热门回答(131 赞)

你可以从另一个线程调用close(),而accept()call将抛出aSocketException


#2 热门回答(28 赞)

设置超时accept(),然后调用将在指定时间后超时阻塞:
http://docs.oracle.com/javase/7/docs/api/java/net/SocketOptions.html#SO_TIMEOUT>阻止套接字操作设置超时:ServerSocket.accept();
SocketInputStream.read();
DatagramSocket.receive();
 必须在进入阻止操作之前设置该选项才能生效。如果超时到期并且操作将继续阻塞,则引发java.io.InterruptedIOException。在这种情况下,套接字未关闭。


#3 热门回答(8 赞)

在2ServerSocketan选项中调用2251411843?
http://java.sun.com/j2se/6/docs/api/java/net/ServerSocket.html#close%28%29>关闭此套接字。当前在accept()中被阻塞的任何线程都将抛出SocketException。