关于java阻塞socket和非阻塞socket的应用区别

最近在学习NIO,在学习非阻塞Socket的时候
很困惑,不知道他相对于阻塞的Socket的优势
在哪,希望大神指点一二,在线等。

7个回答

传统的阻塞式,每个连接必须要开一个线程来处理,并且没处理完线程不能退出。

非阻塞式,由于基于反应器模式,用于事件多路分离和分派的体系结构模式,所以可以利用线程池来处理。事件来了就处理,处理完了就把线程归还。而传统阻塞方式不能使用线程池来处理,假设当前有10000个连接,非阻塞方式可能用1000个线程的线程池就搞定了,而传统阻塞方式就需要开10000个来处理。如果连接数较多将会出现资源不足的情况。非阻塞的核心优势就在这里。

ShaneLooLi
ShaneLooLi 就是这么个机理,10000 个连接很可能 100 个线程就够了。甚至一个线程可以轮询处理多个任务,那么也许 20 个线程就够了。毕竟这个要看 CPU 核数。
7 个月之前 回复
danielinbiti
danielinbiti 回复u010353960: 和server和client没关系,和ajax也不一样,不是同步和异步的概念。
大约 5 年之前 回复
u010353960
潘春伟 回复danielinbiti: 刚才看了一个帖子,得到了一些启发,其实非阻塞IO是为了突破IO性能的瓶颈,一般应该是应用于数据量比较大的IO操作。我就纠结在server和client这块了,想成ajax了。
大约 5 年之前 回复
danielinbiti
danielinbiti 回复u010353960: 关键理解阻塞的意义就行了,资源不够的时候再考虑用哪种方式,有钱也可以增加硬件服务器。线程和阻塞都是一个概念,立足点都是从用户体验和资源消耗出发。
大约 5 年之前 回复
danielinbiti
danielinbiti 回复u010353960: 这是server和client没关系,不要去区分server还是client.阻塞和多线程是两个概念。只能说在一定资源条件下多线程能够解决阻塞的问题。当server的accept到瓶颈时,多个服务器又有何不可。
大约 5 年之前 回复
u010353960
潘春伟 比如我做一个server,监听某个端口,这个时候我的线程开在哪里?要是开对个线程的话,不就得监听多个端口,不就相当于多个server了吗?
大约 5 年之前 回复
danielinbiti
danielinbiti 回复u010353960: 就是为了线程之间不影响,开多个线程来,每个线程内是阻塞的,这种方式来避免相互之间的影响。
大约 5 年之前 回复
u010353960
潘春伟 您一开始说的“传统的阻塞式,每个连接必须要开一个线程来处理,并且没处理完线程不能退出。”这个线程指的是什么啊?
大约 5 年之前 回复
danielinbiti
danielinbiti 回复u010353960: 对,这差不多,一个是主动一直等着有信息或者信息缓冲到一定量才往下执行。一个是有数据来了,通知socket执行
大约 5 年之前 回复
u010353960
潘春伟 可是您在文中说的“传统的阻塞式,每个连接必须要开一个线程来处理”的线程是指的什么线程那?
大约 5 年之前 回复
u010353960
潘春伟 我好想有点懂了,阻塞说的不是socket,其实是read和write,阻塞的read会一直等待,知道有信息输入,而非阻塞的只有当信息已经写好了,可以去读取了才去读取,这样在信息写的过程中我们就可以去处理别的事情了,是这样吗?
大约 5 年之前 回复
danielinbiti
danielinbiti 回复u010353960: 不是一个概念,你这种是多线程方式的阻塞,只是解决防止主线程阻塞。但这里的阻塞和非阻塞主要是IO
大约 5 年之前 回复
u010353960
潘春伟 我一直在做javaee的项目,所以这块还是比较困惑,我看网上很多都说,阻塞的socket每个请求都需要开一个线程来处理。是在accept方法返回socket对象之后,将其交个一个线程处理,然后继续执行循环执行accept方法的意思吗?
大约 5 年之前 回复

阻塞的程序简单,发送和接收一一对应,但是等待回复的过程中程序没响应,如果一直没回复就“死机”了。
非阻塞的正好相反,程序复杂但是响应快。

Tiger_Zhao
Tiger_Zhao 回复u010353960: 两个概念,出发点不同。调用者:同步必须等结果、异步可以先去做别的事;被调用者:阻塞必须有了结果控制才会返回给上级,非阻塞先把控制返回给上级有结果再通知。不是特别限定的情况下两者其实是混用的。
大约 5 年之前 回复
u010353960
潘春伟 非阻塞和异步应该是两个概念吧?
大约 5 年之前 回复
u010353960
潘春伟 回复Tiger_Zhao: 我一直做的都是javaee的项目,没有接触过gui的编程,按照您的说话,他是等同于ajax吗?
大约 5 年之前 回复
Tiger_Zhao
Tiger_Zhao 回复u010353960: 阻塞和非阻塞都可以实现超时功能。一般阻塞的后台用的多(一个函数搞定),非阻塞的前台用的多(界面不能死掉)。
大约 5 年之前 回复
u010353960
潘春伟 应用于什么需求?
大约 5 年之前 回复
u010353960
潘春伟 在我的印象中tomcat使用的应该是阻塞的socket,所以有的时候他需要设置一个超时时间?非阻塞的Socket一般
大约 5 年之前 回复

阻塞就是一直等待结果返回,非阻塞就是立即返回,等有了结果了以后,再回调,事件通知你

u010353960
潘春伟 回复oyljerry: 一般socket在接收到一个事件的时候是不是很会新开辟一个线程,去处理对应的业务,然后继续执行循环,执行select()。否则如果某个业务处理的时间比较长的话,会阻塞服务啊?
大约 5 年之前 回复
oyljerry
oyljerry 回复u010353960: select还可以处理其他事件啊。并不会一直等一个事件
大约 5 年之前 回复
oyljerry
oyljerry 回复u010353960: select还可以处理其他事件啊。并不会一直等一个事件
大约 5 年之前 回复
u010353960
潘春伟 非阻塞的socket在执行selector的select()方法的时候不也是阻塞的吗?
大约 5 年之前 回复

总的来说非阻塞肯定更加节约资源,而且非阻塞是系统来通知你,然后你做相应处理代码逻辑性更好。阻塞的那种要严格一步一步的来一部错了逻辑就全部乱了

谢谢大家,刚才在看你们回复的同事,也看了一篇帖子
。现在明白了5成了吧,我自己再研究研究,消化一下

阻塞就是一直等待结果返回,非阻塞就是立即返回,等有了结果了以后,再回调,事件通知你

阻塞的程序简单,发送和接收一一对应,但是等待回复的过程中程序没响应,如果一直没回复就“死机”了。
非阻塞的正好相反,程序复杂但是响应快

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐