关于Java ServerSocket接受:忙等待?

时间:2014-03-15 05:08:43

标签: java serversocket

我正在阅读Java中的TCP / IP套接字,关于serversocket,它说

  

当我们在那个ServerSocket上调用accept()时   例如,如果新连接处于挂起状态,则accept()立即返回;否则就会阻止   直到连接进入或计时器到期,以先到者为准。这允许   一个线程来处理多个连接。不幸的是,方法需要这样做   我们不断轮询所有I / O来源,这种“忙碌等待”的方法再次引入   骑自行车通过连接的很多开销只是为了发现他们有   无事可做。

根据我的理解,这应该通知""当一个连接到来时,不应该“等待”#34 ;?我误解了什么......?

----------------- 修改 ----------------------

整段如下:

  

由于这些复杂性,一些程序员喜欢坚持使用单线程   方法,其中服务器只有一个线程,它处理所有客户端 - 而不是顺序,   但是一下子。这样的服务器不能阻止任何I / O操作   一个客户端,必须专门使用非阻塞I / O.回想一下,对于非阻塞I / O,我们指定对I / O方法的调用可能阻塞的最大时间量(包括零)。   我们在第4章看到了一个例子,我们在accept操作上设置了一个超时   (通过ServerSocket的setSoTimeout()方法)。当我们在那个ServerSocket上调用accept()时   例如,如果新连接处于挂起状态,则accept()立即返回;否则就会阻止   直到连接进入或计时器到期,以先到者为准。这允许   一个线程来处理多个连接。不幸的是,这种方法需要   我们不断轮询所有I / O源,并再次引入那种“忙碌等待”的方法   骑自行车通过连接的很多开销只是为了发现他们有   无事可做

1 个答案:

答案 0 :(得分:0)

即使在整个报价中,这也是无意义的。 要么你正在使用阻塞I / O,在这种情况下你需要每个连接一个线程,另一个每个accept()循环,你正在使用非阻塞I / O,在这种情况下,您使用Java 7中的select(),,您正在使用异步I / O,在这种情况下,它都是完成处理程序的回调。在这些情况下,您都不需要轮询或忙碌等待。

认为他必须指的是使用非常短暂超时的阻止模式,但实际上最不清楚。