前言:同步阻塞IO会有很大的性能问题,那么使用线程池控制呢,就有了伪异步IO,通过线程池对消息队列和最大线程数进行控制,例子见下
package com.honzh.mwq.bio.server.handler; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class TimeServerHandlerPool { private ExecutorService service; /** * @Title: TimeServerHandlerPool * @Description: 构造方法需要进行说明一下:<br> * <p>1.Runtime.getRuntime().availableProcessors()可以向Java虚拟机获取可用处理器的数目</p> * <p>2.同时你可以在cmd命令下通过echo %NUMBER_OF_PROCESSORS%获取可用的cpu可用线程数</p> * <p>3.我的机器是i3 3220,是一个2核心4线程的处理器,那么在不考虑资源冲突的情况下,可以支持虚拟4核的任务</p> * <p>4.同时查看API可以知道,对于有界队列,corepoolsize和maxpoolsize之间有一定的关系,在execute执行任务时,如果运行的线程小于core,那么始终会创建新的线程, * 如果运行的线程等于大于core,那么就会将请求加入队列,如果无法加入队列,则创建新的线程,如果线程数大于max,则任务将被拒绝。 * </p> * */ public TimeServerHandlerPool() { service = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(), 100, 120L, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(1000)); } public void execute(Runnable task) { service.execute(task); } }
这个类非常关键,注意注释中所说的内容,
另外再看server类
TimeServerHandlerPool pool = new TimeServerHandlerPool(); Socket socket = null; while (true) { socket = server.accept(); pool.execute(new TimeServerHandler(socket)); }
通过线程池管理请求任务。
总结:伪异步IO有效的解决了资源宕机的问题,但是依然有如下问题存在,输入输出流依然是阻塞的,假如server返回信息阻塞了1分钟,那么对应的client在获取资源的时候也会在读取流中阻塞1分钟,接着假如以后的请求都不能再加入到阻塞队列后,新的请求将会被拒绝,那么这就像等于系统崩溃了。
相关推荐
### 异步IO:Python中的并发编程革命 Python 自问世以来,就因其简洁优雅的语法、易学且功能强大等特点迅速赢得了程序员们的喜爱。随着计算机技术的发展与应用场景的不断拓展,传统的同步IO模型逐渐难以满足高并发...
伪异步IO:将请求连接放入线程池,一对多,但线程还是很宝贵的资源。 NIO:一个请求一个线程,但客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。 AIO:一...
- 伪异步IO:为了解决BIO效率低的问题,引入了线程池,连接请求不再创建新线程,而是放入线程池中,但是线程池的线程依然是有限资源。 - NIO(非阻塞IO):同步非阻塞式的IO操作,通过使用选择器(Selector)来...
伪异步 IO:将请求连接放入线程池,一对多,但线程还是很宝贵的资源。 NIO(Non-Blocking I/O):一个请求一个线程,但客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有 I/O 请求时才启动一个...
- 伪异步IO是对BIO的一种改进,它使用线程池来减少线程的开销,但是仍然存在线程资源紧张的问题。 - NIO(New IO)是Java在1.4版本引入的新的IO模型。NIO采用面向缓冲区(Buffer)和通道(Channel)的概念,支持面向...
伪异步 IO:将请求连接放入线程池,一对多,但线程还是很宝贵的资源。 NIO:一个请求一个线程,但客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有 I/O 请求时才启动一个线程进行处理。 AIO:一...
异步IO是一种真正意义上的异步IO模型。在这种模型中,用户线程发起IO请求后立即返回,并继续执行其他任务。当IO操作完成后,内核会通知用户线程或直接调用用户线程预先注册的回调函数。 **工作原理**: - 用户线程...
为了实现异步读写,我们可以使用一种伪异步 socket 通讯的方法。基本思想就是在现有 socket 类的基础上进行封装,当 socket 连接建立成功后,立即创建一个 socket 数据接收线程,专门负责阻塞式的 socket 读取(read)...
异步IO是解决这一问题的一种方式,它允许程序在等待I/O操作完成时切换到执行其他任务,而无需创建新的线程或进程。Python 3.4引入了`asyncio`模块,提供了对异步IO的支持。异步IO的核心是事件循环(Event Loop),它...
在某些情况下,可以考虑使用异步API来提高性能,特别是在处理大量数据时。 通过理解和正确使用C#中的伪随机数生成器和加密机制,开发者可以构建出安全、可靠的加密解决方案。提供的源码是一个很好的学习资源,可以...
- **异步IO模型**:为了实现高性能,服务器采用IO完成端口(IOCP)模型,这是一种非阻塞的异步IO模型,适用于Windows服务器开发。 - **IOCP模型**:这种模型允许服务器并发处理多个请求,提高系统吞吐量,同时降低...
ngdeepak.github.io的源代码中,可能会包含CSS类选择器、ID选择器、伪类和伪元素的用法,以及盒模型、布局模式(如Flexbox或Grid)、响应式设计等技术,这些都是现代网页设计的关键组成部分。 JavaScript是使网页...
CSS还可能包含了对动画、过渡和自定义伪类的选择器,以增加交互性。 JavaScript是一种动态编程语言,用于实现网页的交互功能。在"skylon.github.io"的源代码中,JavaScript文件可能以`.js`扩展名出现。这些脚本可能...
JavaScript可以处理用户输入、改变DOM(文档对象模型)、执行异步请求(AJAX)等,增强用户体验。 6. **GitHub Pages工作流程**:创建、编辑和部署过程可能涉及GitHub的版本控制,如提交更改、拉取请求和部署到...
伪并发模型主要用在需要大量并发而又不希望引入太多线程管理开销的场景,如网络编程、异步IO操作等。与线程并发模型相比,协程并发模型可以大大减少上下文切换的开销,并且可以更高效地利用系统资源,提高程序的性能...
伪异步;NIO类库 ; 入门篇:Jetty简单应用入门;TCP粘包拆包;定位符和定长解码器; 中级篇:编解码技术和常用的序列化框架(protobuf /java/Marshalling) 高级篇:Http协议开发; Netty 协议栈开发(数据结构定义...
通过类选择器、ID选择器、伪类等,可以精准地选择并应用样式。例如,`.header`可能是一个类,用于设置整个头部的样式;`#logo`可能是一个ID,用于唯一标识网站的logo元素。 JavaScript是一种强大的客户端脚本语言,...
3. CSS选择器和样式规则:了解如何通过类选择器、ID选择器、伪类等来指定元素的样式,并掌握盒模型、布局方式(如流体布局、网格布局)和响应式设计。 4. JavaScript基础:变量、数据类型、运算符、控制流程(条件...
2.异步与同步IO 同步服务器架构 同步服务器如何工作? 让我们从以伪代码编写的朴素单线程服务器开始: // file: single_threaded_server.psuedo while ( true ) { // Blocking listen on some port for a request ...