当前位置: 首页 > 知识库问答 >
问题:

关于Java ServerSocket Accept:忙着等待?

韩靖琪
2023-03-14

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

当我们在该ServerSocket实例上调用接受()时,如果新连接挂起,接受()立即返回;否则它会阻塞,直到连接进入或计时器到期,以先到者为准。这允许单个线程处理多个连接。不幸的是,这种方法要求我们不断轮询所有I/O源,而这种“忙等待”方法再次引入了大量开销,因为循环遍历连接只是为了发现它们无事可做。

据我所知,当连接到来时,是否应该“通知”,因此不应该“忙于等待”?我误解了什么吗...?

-----------------编辑----------------------

整段内容如下:

由于这些复杂性,一些程序员更喜欢使用单线程方法,在这种方法中,服务器只有一个线程,它不按顺序处理所有客户机,而是同时处理所有客户机。这样的服务器无法承受任何一个客户端的I/O操作阻塞,必须专门使用非阻塞I/O。回想一下,对于非阻塞I/O,我们指定了对I/O方法的调用可能阻塞的最大时间量(包括零)。我们在第4章中看到了一个例子,我们在接受操作上设置了超时(通过ServerSocket的setSoTimeout()方法)。当我们在该ServerSocket实例上调用accept()时,如果新连接挂起,accept()立即返回;否则,它会阻塞,直到连接进入或计时器过期,以先到者为准。这允许单个线程处理多个连接。不幸的是,这种方法要求我们不断轮询所有输入/输出源,而这种“繁忙等待”方法再次引入了大量开销,因为循环连接只是为了发现它们与之无关

共有1个答案

仰翔
2023-03-14

这几乎是胡说八道,即使是在整个引用中。要么您使用阻塞I/O,在这种情况下,每个连接需要一个线程,每个accept()循环需要一个线程,要么您使用非阻塞I/O,在这种情况下,您有select(),或者,从Java 7中,您使用异步I/O,在这种情况下,它都是对完成处理程序的回调。在这些情况下,您都不需要投票或忙于等待。

我想他一定是指使用阻塞模式,超时时间很短,但这确实是最不清楚的。

 类似资料:
  • 嗨,我正在做一个项目,我已经达到了我非常困的部分。我试图寻找方法来学习如何在繁忙的等待中编写 while 循环,但我没有找到任何东西,我的代码只是作为无限循环运行。有人可以帮助我解释一个繁忙的等待循环应该如何工作,并帮助我打破这个无限循环吗? 该项目希望做到以下几点:早上,学生醒来后(这需要一段随机的时间),他会去洗手间为新的上学日做准备。如果浴室已经客满,学生需要Rest一下(使用yield()

  • 根据C 11标准(草案n3337)§5/9: -如果两个操作数的类型相同,则无需进一步转换。 -否则,如果两个操作数都具有有符号整数类型或都具有无符号整数类型,则整数转换秩较小的操作数类型应转换为秩较大的操作数类型。 -否则,如果具有无符号整数类型的操作数的秩大于或等于另一个操作数类型的秩,则应将具有有符号整数类型的操作数转换为具有无符号整数类型的操作数的类型。 -否则,如果有符号整数类型的操作数

  • 演示Demo 图中 一个flex容器内部有四个div元素, div内部的img的宽度设置为100px。 默认情况下flex-wrap=nowrap flex子项会一行显示且不允许换行,因此可能会出现宽度溢出的问题。 问题1 “因此可能会出现宽度溢出的问题” : 这个宽度溢出应该也是有 条件的吧? 虽然flex子项的累计宽度大于flex容器,但是默认情况下 flex子项是允许收缩的。 如果收缩以后还

  • 我正在阅读有关Webdriver隐式等待的文档,但我不确定我是否完全理解。 据我所知, 这将在查找任何元素时设置10秒的超时。 这到底是干什么用的? > 这是否意味着在查找任何元素时,即使该元素存在,我每次都会等待10秒?或者,在查找任何元素时,驱动程序是否会在确定缺少元素之前为浏览器提供 10 秒的宽限期来加载元素? 由于这适用于每个元素,我是否正确地假设对于Webdriver的每个实例只执行一

  • 在2006年的模糊C代码竞赛中。请解释sykes2。c 有一个语句“

  • 使用App Engine Flexible环境,我准备部署Angular 4客户端,并研究云endpoint来处理我的节点。js/express微服务似乎简化了endpoint请求的安全保护和身份验证,我想澄清几件事: > 我是使用云endpoint作为API网关,将请求路由到各个微服务后端,还是应该将微服务本身构建为各个endpoint应用程序? 我是静态托管Angular 4应用程序(与服务器