- 浏览: 375061 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
真的全站唯一:
描述的能不能准确一点,我也以为bigDecimal性能比dou ...
【性能】Java BigDecimal和double性能比较 -
zhanggang807:
学习到了。。以后会考虑往这方面设计
【java规范】Java spi机制浅谈 -
Xiong506:
xiyuan1025 写道你这是在linux下吗,我在linu ...
[监控]Btrace监控简单笔记 -
Xiong506:
xiyuan1025 写道你这是在linux下吗,我在linu ...
[监控]Btrace监控简单笔记 -
Bll:
找不到实现类
【java规范】Java spi机制浅谈
JDK7 AIO初体验
JDK7已经release一段时间了,有个重要的新特性是AIO。
今天趁闲暇,简单体验了下,简单分享如下:
关于AIO的概念理解
关于AIO的概念,仅谈谈个人的一点理解。可能不到位,请大家指出。
Io的两个重要步骤:发起IO请求,和实际的IO操作。在unix网络编程的定义里异步和非异步概念的区别就是实际的IO操作是否是由操作系统完成。如果是就是异步,如果不是就是同步。
而阻塞和非阻塞的区别在于发起IO请求的时候是否会阻塞,如果会就是阻塞,不会就是非阻塞。
本人理解能力有限,想了个例子来辅助自己理解:
小明想要买一本<深入java虚拟机>的书,以下几个场景可以来理解这几种io模式:
1. 如果小明每天都去书店问售货员说有没有这本书,如果没有就回去继续等待,等下次再过来文。(阻塞)
2. 如果小明告诉售货员想买一本<深入java虚拟机>的书,那么就在家里等着做其他事情去了,如果书到了售货员就通知小明,小明再自己过去取。
3. 如果小明告售货员想买一本<深入java虚拟机>的书,然后告诉售货员到了帮他送到某某地方去,就做其他事情去了。小明就不管了,等书到了,售货员就帮他送到那个地方了。
售货员可以认为是操作系统的一个服务,而小明是一个用户进程。不知道是否有误,如果有误请大家拍砖指出,谢谢。
可以看出2,3的效率明显要比1高。但是1最简单,而2,3需要一些协作。充分证明了团队合作的力量。
JDK7 AIO初体验
AsynchronousChannel:支持异步通道,包括服务端AsynchronousServerSocketChannel和普通AsynchronousSocketChannel等实现。
CompletionHandler:用户处理器。定义了一个用户处理就绪事件的接口,由用户自己实现,异步io的数据就绪后回调该处理器消费或处理数据。
AsynchronousChannelGroup:一个用于资源共享的异步通道集合。处理IO事件和分配给CompletionHandler。(具体这块还没细看代码,后续再分析这块)
以一个简单监听服务端为例,基本过程是:
1. 启动一个服务端通道
2. 定义一个事件处理器,用户事件完成的时候处理,如消费数据。
3. 向系统注册一个感兴趣的事件,如接受数据,并把事件完成的处理器传递给系统。
4. 都已经交待完毕,可以只管继续做自己的事情了,操作系统在完成事件后通过其他的线程会自动调用处理器完成事件处理。
以下用一个例子来简单实现,一个服务端和客户端。服务端监听客户端的消息,并打印出来。
AIOServer.java
package io.aio; import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.AsynchronousServerSocketChannel; import java.nio.channels.AsynchronousSocketChannel; import java.nio.channels.CompletionHandler; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; /** * * @author noname */ public class AIOServer { public final static int PORT = 9888; private AsynchronousServerSocketChannel server; public AIOServer() throws IOException { server = AsynchronousServerSocketChannel.open().bind( new InetSocketAddress(PORT)); } public void startWithFuture() throws InterruptedException, ExecutionException, TimeoutException { System.out.println("Server listen on " + PORT); Future<AsynchronousSocketChannel> future = server.accept(); AsynchronousSocketChannel socket = future.get(); ByteBuffer readBuf = ByteBuffer.allocate(1024); readBuf.clear(); socket.read(readBuf).get(100, TimeUnit.SECONDS); readBuf.flip(); System.out.printf("received message:" + new String(readBuf.array())); System.out.println(Thread.currentThread().getName()); } public void startWithCompletionHandler() throws InterruptedException, ExecutionException, TimeoutException { System.out.println("Server listen on " + PORT); //注册事件和事件完成后的处理器 server.accept(null, new CompletionHandler<AsynchronousSocketChannel, Object>() { final ByteBuffer buffer = ByteBuffer.allocate(1024); public void completed(AsynchronousSocketChannel result, Object attachment) { System.out.println(Thread.currentThread().getName()); System.out.println("start"); try { buffer.clear(); result.read(buffer).get(100, TimeUnit.SECONDS); buffer.flip(); System.out.println("received message: " + new String(buffer.array())); } catch (InterruptedException | ExecutionException e) { System.out.println(e.toString()); } catch (TimeoutException e) { e.printStackTrace(); } finally { try { result.close(); server.accept(null, this); } catch (Exception e) { System.out.println(e.toString()); } } System.out.println("end"); } @Override public void failed(Throwable exc, Object attachment) { System.out.println("failed: " + exc); } }); // 主线程继续自己的行为 while (true) { System.out.println("main thread"); Thread.sleep(1000); } } public static void main(String args[]) throws Exception { new AIOServer().startWithCompletionHandler(); } }
AIOClient.java
package io.aio; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.AsynchronousSocketChannel; public class AIOClient { public static void main(String... args) throws Exception { AsynchronousSocketChannel client = AsynchronousSocketChannel.open(); client.connect(new InetSocketAddress("localhost", 9888)); client.write(ByteBuffer.wrap("test".getBytes())).get(); } }
服务端写了两种处理实现方式,startWithCompletionHandler是通过Handler来处理,startWithFuture是通过Future方式来处理。startWithCompletionHandler方法里可以看到调用accepte()完成异步注册后,线程就可以继续自己的处理了,完全不被这个io所中断。
从以上来看AIO的代码简单了很多,至少比NIO的代码实现简单很多。
本文理解暂处于体验阶段,深入学习还待后面,欢迎一起交流。
参考资料
http://www.oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html
http://blog.csdn.net/roger_77/article/details/1555170
http://download.oracle.com/javase/tutorial/essential/io/file.html
发表评论
-
Xml ResourceBundle简单实现
2012-04-17 21:45 4364ResourceBundle主要是用于和本地语言环境相关的一些 ... -
【maven】多子模块maven模板工程archetype创建过程
2012-04-02 20:55 17573最近项目里需要创建一 ... -
【java基础】如何设计java应用程序的平滑停止
2012-03-05 23:44 10923java应用程序退出的触发机制有: 1.自动结束:应用没有存 ... -
【java并发】juc Executor框架详解
2012-02-26 13:55 12374Executor 框架是 juc 里提供的线程池的实现。 ... -
【java并发】juc高级锁机制探讨
2012-02-23 00:52 8510最近在看一些j ... -
【java并发】基于JUC CAS原理,自己实现简单独占锁
2012-02-14 13:47 7765synchronized的基本原理回 ... -
[NoSQL]MongoDB初体验
2012-01-05 16:06 3925因为未来业务发展的一 ... -
【JVM】HotSpot JVM内存管理和GC策略总结
2011-12-13 22:05 15877JVM的相关知识是学习java ... -
32位机器下的一个java.lang.OutOfMemoryError错误分析
2011-10-17 11:19 2546昨天在本人windows机器( ... -
[监控]Btrace监控简单笔记
2011-09-09 10:57 4902前阵子看了公司网站的一个cache 命中率统计的btrace监 ... -
DBCP数据源配置项记录
2011-09-01 20:22 2933网站最近发生了数据库连接爆掉的问题。排查了下各个应用存在 ... -
【性能】Java BigDecimal和double性能比较
2011-08-28 20:06 14107我们知道 java 里面有个 BigDecimal ... -
【Spring】IOC容器并发条件下,可能发生死锁
2011-08-28 17:07 68321.背景 上周在生产环境应用启 ... -
如果要用java实现算法,一定慎用递归
2011-04-06 20:41 12823现象 : 递归是我们很经典的一种算法实现,可以很好的 ... -
java日志,需要知道的几件事(commons-logging,log4j,slf4j,logback)
2011-02-28 17:12 46237java日志,需要知道的几件事 如果对于comm ... -
JVM问题诊断常用命令:jinfo,jmap,jstack
2010-08-17 17:55 123951.jinfo 描述:输出给定 java ... -
java 浮点数为什么精度会丢失
2010-07-15 22:30 4838由于对float或double 的使用不当,可能会出现精度 ... -
一个枚举类的方法设计
2010-06-21 15:28 1647public enum ActionType { A ... -
java内部字符编码浅析
2010-06-07 21:43 6794java内部字符编码浅析 本周遇到一个 ... -
JDK反射之JDK动态proxy
2010-06-07 21:27 4062JDK动态代理 JDK 动态代理是 java 反射的一 ...
相关推荐
JDK7安装包.zip\JDK7安装包.zip\JDK7安装包.zip\JDK7安装包.zip\JDK7安装包.zip JDK7安装包.zip\JDK7安装包.zip\JDK7安装包.zip\JDK7安装包.zip\JDK7安装包.zip JDK7安装包.zip\JDK7安装包.zip\JDK7安装包.zip\JDK7...
1.1 JDK7新特性<一>概述 . . . . . . . . . ....1.2 JDK7新特性<二> 语法 ....1.3 JDK7新特性<三> JDBC4.1 ....1.4 JDK7新特性<四> NIO2.0 文件系统 ....1.5 JDK7新特性<五> fork/...1.8 JDK7新特性<八>异步io/AIO . . . . . . . .
NULL 博文链接:https://shihuan830619.iteye.com/blog/2258961
jdk7j下载jdk7j下载jdk7j下载jdk7j下载jdk7j下载jdk7j下载jdk7j下载jdk7j下载jdk7j下载jdk7j下载jdk7j下载jdk7j下载jdk7j下载
jdk7 jdk8 jdk9 jdk10 jdk11 jdk12 jdk13 jdk14 (win-64位) 资源共享
jdk7chm,java7帮助,jdk7api,jdk1.7帮且文档,jdk7api chm,JDK(Java Development Kit)是Sun Microsystems针对Java开发员的产品。自从Java推出以来,JDK已经成为使用最广泛的Java SDK。JDK 是整个Java的核心,包括了...
jdk7 jdk-7u80-linux-x64 网盘下载
jdk7免安装版,可以正常使用,有问题可以联系我,JDK(Java Development Kit)就是Java的开发工具包,无论是开发javase,javaee,javaee.是给Java开发者必须用到的开发工具
jdk7,openjdk7,适用于arm64、aarch64架构linux等国产化服务器,如银河麒麟V10、uos等服务器系统。 详细信息 jdk7 arm64 aarch64 。亲测可用。
jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-...
jdk-7u80-windows-x64.exe 【官方下载的jdk1.7、jdk7,windows 64位版】
JDK1.7最终版,jdk-7u80,包含文件如下: jdk-7u80-linux-i586.gz jdk-7u80-linux-x64.tar.gz jdk-7u80-windows-i586.exe jdk-7u80-windows-x64.exe
jdk7安装包jdk7安装包jdk7安装包jdk7安装包jdk7安装包jdk7安装包jdk7安装包
jdk-7u79-windows-i586.exe JDK7 稳定版 源官方下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html
linux平台的64位版本jdk7,官方原版,hash可匹配验证 。
jdk7安装程序
Mac版的jdk7,官网好像不好下,得登录Mac版的jdk7,官网好像不好下,得登录Mac版的jdk7,官网好像不好下,得登录Mac版的jdk7,官网好像不好下,得登录Mac版的jdk7,官网好像不好下,得登录Mac版的jdk7,官网好像不好...
JAVA JDK7 1.7.80 Windows 32位版本,生产环境中亲自安装好用。
Java JDK 7学习笔记 PDF
JDK7u4的API,JDK7的帮助文档