问题
在我的主线程中,我有一个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 赞)
在2ServerSocket
an选项中调用2251411843?
http://java.sun.com/j2se/6/docs/api/java/net/ServerSocket.html#close%28%29>关闭此套接字。当前在accept()中被阻塞的任何线程都将抛出SocketException。