`
qing_gee
  • 浏览: 118481 次
  • 性别: 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:...

    java-NIO-demo

    java,bio、伪异步io、nio的demo例子安装完JDK可以直接运行

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

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

    服务器概要设计说明.docx

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

    Netty权威指南

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

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

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

    stanica.github.io

    小图标大小的图像上的压缩会导致许多视觉伪像。 我包括使用JavaScript而不是默认样式表链接的Open Sans字体。 我缩小了CSS并将其包含在index.html中。 PageSpeed Insight工具需要此功能,我对此不太满意。 形式和...

    python入门到高级全栈工程师培训 第3期 附课件代码

    01 异步IO 02 selectors模块介绍 03 selectors模块应用 04 作业介绍 第37章 01 selctors实现文件上传与下载 02 html的介绍 03 html文档树的概念 04 meta标签以及一些基本标签 05 img标签和列表标签 06 form表单之...

    新编MCS-51单片机应用设计(清晰最新版)

    8.3 MCS—51与可编程RAM/IO芯片8155H的接口 8.3.1 8155H芯片介绍 8.3.2 MCS—51与8155H的接口及软件编程 8.4 用74LSTIL电路扩展并行I/O口 8.4.1 用74LS377扩展8位并行输出口 8.4.2 用74LS373扩展8位并行输入口 ...

    超级有影响力霸气的Java面试题大全文档

    当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。 20、abstract class和interface有什么区别? ...

    java 面试题 总结

    当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。 17、abstract class和interface有什么区别? 声明方法...

Global site tag (gtag.js) - Google Analytics