`
qing_gee
  • 浏览: 119693 次
  • 性别: Icon_minigender_1
  • 来自: 河南
社区版块
存档分类
最新评论

伪异步IO

    博客分类:
  • Java
阅读更多

前言:同步阻塞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分钟,接着假如以后的请求都不能再加入到阻塞队列后,新的请求将会被拒绝,那么这就像等于系统崩溃了。

0
2
分享到:
评论

相关推荐

    Netty面试专题及答案.pdf

    伪异步IO:将请求连接放入线程池,一对多,但线程还是很宝贵的资源。 NIO:一个请求一个线程,但客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。 AIO:一...

    netty面试专题-答案-一起学习

    伪异步 IO:将请求连接放入线程池,一对多,但线程还是很宝贵的资源。 NIO:一个请求一个线程,但客户端发送的连接请求都会注册到多路复用器上,多路复用 器轮询到连接有 I/O 请求时才启动一个线程进行处理。 AIO:...

    10道Java高级必备的Netty面试题

    伪异步 IO:将请求连接放入线程池,一对多,但线程还是很宝贵的资源。 NIO(Non-Blocking I/O):一个请求一个线程,但客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有 I/O 请求时才启动一个...

    Netty 35道面试题和答案.docx

    伪异步 IO:将请求连接放入线程池,一对多,但线程还是很宝贵的资源。 NIO:一个请求一个线程,但客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有 I/O 请求时才启动一个线程进行处理。 AIO:一...

    _java中异步socket类的实现和源代码.doc

    为了实现异步读写,我们可以使用一种伪异步 socket 通讯的方法。基本思想就是在现有 socket 类的基础上进行封装,当 socket 连接建立成功后,立即创建一个 socket 数据接收线程,专门负责阻塞式的 socket 读取(read)...

    复习 J2SE基本内容 IO NIO AIO 的区别

    当然AIO的异步特性并不是Java实现的伪异步,而是使用了系统底层API的支持,  BIO与NIO一个比较重要的不同,是我们使用BIO的时候往往会引入多线程,每个连接一个单独的线程;而NIO则是使用单线程或者只使用少量的多...

    python 单线程和异步协程工作方式解析

    异步IO是解决这一问题的一种方式,它允许程序在等待I/O操作完成时切换到执行其他任务,而无需创建新的线程或进程。Python 3.4引入了`asyncio`模块,提供了对异步IO的支持。异步IO的核心是事件循环(Event Loop),它...

    C#伪随机数加密完整源码

    在某些情况下,可以考虑使用异步API来提高性能,特别是在处理大量数据时。 通过理解和正确使用C#中的伪随机数生成器和加密机制,开发者可以构建出安全、可靠的加密解决方案。提供的源码是一个很好的学习资源,可以...

    服务器概要设计说明.docx

    目录 功能概述 2 网络通信层 3 连接生命周期的管理 3 接口 3 异步IO缓冲内存池 3 本地数据与字节流数据的互相转换 4 信令和通信数据结构 5 伪代码定义 5 命令管理 7 数据有效性检测 8 文件传输通道 9 日志 10 功能...

    服务器概要设计.docx

    - **异步IO模型**:为了实现高性能,服务器采用IO完成端口(IOCP)模型,这是一种非阻塞的异步IO模型,适用于Windows服务器开发。 - **IOCP模型**:这种模型允许服务器并发处理多个请求,提高系统吞吐量,同时降低...

    ngdeepak.github.io

    ngdeepak.github.io的源代码中,可能会包含CSS类选择器、ID选择器、伪类和伪元素的用法,以及盒模型、布局模式(如Flexbox或Grid)、响应式设计等技术,这些都是现代网页设计的关键组成部分。 JavaScript是使网页...

    skylon.github.io

    CSS还可能包含了对动画、过渡和自定义伪类的选择器,以增加交互性。 JavaScript是一种动态编程语言,用于实现网页的交互功能。在"skylon.github.io"的源代码中,JavaScript文件可能以`.js`扩展名出现。这些脚本可能...

    Thordaff.github.io

    JavaScript可以处理用户输入、改变DOM(文档对象模型)、执行异步请求(AJAX)等,增强用户体验。 6. **GitHub Pages工作流程**:创建、编辑和部署过程可能涉及GitHub的版本控制,如提交更改、拉取请求和部署到...

    Netty权威指南

    伪异步;NIO类库 ; 入门篇:Jetty简单应用入门;TCP粘包拆包;定位符和定长解码器; 中级篇:编解码技术和常用的序列化框架(protobuf /java/Marshalling) 高级篇:Http协议开发; Netty 协议栈开发(数据结构定义...

    BLUState.github.io

    通过类选择器、ID选择器、伪类等,可以精准地选择并应用样式。例如,`.header`可能是一个类,用于设置整个头部的样式;`#logo`可能是一个ID,用于唯一标识网站的logo元素。 JavaScript是一种强大的客户端脚本语言,...

    20210410.github.io

    3. CSS选择器和样式规则:了解如何通过类选择器、ID选择器、伪类等来指定元素的样式,并掌握盒模型、布局方式(如流体布局、网格布局)和响应式设计。 4. JavaScript基础:变量、数据类型、运算符、控制流程(条件...

    node-workshop:ScaleConf Node.js Workshop示例说明异步编程和事件循环

    2.异步与同步IO 同步服务器架构 同步服务器如何工作? 让我们从以伪代码编写的朴素单线程服务器开始: // file: single_threaded_server.psuedo while ( true ) { // Blocking listen on some port for a request ...

    dannyzolp.github.io

    3. **JavaScript**:JavaScript是网页动态交互的核心,用于处理用户输入、操作DOM(文档对象模型)、异步通信(AJAX)以及创建复杂的Web应用程序。ES6(ECMAScript 6)及后续版本提供了许多新语法特性,如let和const...

    ahmedmiraz.github.io

    通过使用类选择器、ID选择器、伪类等,可以控制元素的颜色、大小、位置等属性。 4. **响应式设计**:考虑到不同设备的屏幕尺寸,现代网页通常采用响应式设计。利用CSS的媒体查询,可以确保网页在手机、平板电脑和...

    jonathanknudsen.github.io

    CSS3引入了更多高级特性,如Flexbox用于灵活的布局,Grid布局用于二维网格系统,以及过渡、动画和伪类等增强用户体验的特性。 此外,可能还会有JavaScript的使用,这是网站动态交互的核心。JavaScript可以改变HTML...

Global site tag (gtag.js) - Google Analytics