在建立连接之前,accept() 方法究竟是如何被阻塞的?
How exactly accept() method is blocked until a connection is made?
来自 java.net.ServerSocket#accept():
public Socket accept() throws IOException
Listens for a connection to be made to this socket and accepts it. The
method blocks until a connection is made.
我不明白在建立连接之前该方法的执行究竟是如何停止的。我搜索了源代码,但没有看到任何 while(true)
循环或 wait/notify
.
我用谷歌搜索了这个问题,但找不到它是如何工作的解释。
在 PlainSocketImpl
中,您有 native void socketAccept(SocketImpl s) throws IOException;
方法。所以它会阻塞在本地代码中,你不需要关心它是如何完成的。
我对此不完全确定,但我认为 accept() 通过某些本机库(可能是某些 C 或 C++ 库)执行 accept
系统调用。 accept
系统调用将阻塞等待合适的传入连接。在这一点上,它不是 Java 依赖的,它取决于每个 OS 如何实现它。
来自 java.net.ServerSocket#accept():
public Socket accept() throws IOException
Listens for a connection to be made to this socket and accepts it. The method blocks until a connection is made.
我不明白在建立连接之前该方法的执行究竟是如何停止的。我搜索了源代码,但没有看到任何 while(true)
循环或 wait/notify
.
我用谷歌搜索了这个问题,但找不到它是如何工作的解释。
在 PlainSocketImpl
中,您有 native void socketAccept(SocketImpl s) throws IOException;
方法。所以它会阻塞在本地代码中,你不需要关心它是如何完成的。
我对此不完全确定,但我认为 accept() 通过某些本机库(可能是某些 C 或 C++ 库)执行 accept
系统调用。 accept
系统调用将阻塞等待合适的传入连接。在这一点上,它不是 Java 依赖的,它取决于每个 OS 如何实现它。