如何中断 ServerSocket accept() 方法?

2022-08-31 07:13:43

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

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

但是,循环中的调用会阻塞,并且似乎没有任何方法可以中断它,因此无法再次检查while条件,并且程序无法退出!accept()while(listening)

有没有更好的方法来做到这一点?还是某种方式来中断阻塞方法?


答案 1

您可以从另一个线程调用 close(),accept() 调用将引发 SocketException


答案 2

将超时设置为 ,则调用将在指定时间后使阻塞超时:accept()

http://docs.oracle.com/javase/7/docs/api/java/net/SocketOptions.html#SO_TIMEOUT

设置阻止操作的超时:Socket

ServerSocket.accept();
SocketInputStream.read();
DatagramSocket.receive();

必须在进入阻塞操作之前设置该选项才能生效。如果超时过期并且操作将继续阻塞,则会引发。在这种情况下,不会关闭 。java.io.InterruptedIOExceptionSocket


推荐