- 浏览: 378601 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
真的全站唯一:
描述的能不能准确一点,我也以为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 4467ResourceBundle主要是用于和本地语言环境相关的一些 ... -
【maven】多子模块maven模板工程archetype创建过程
2012-04-02 20:55 17662最近项目里需要创建一 ... -
【java基础】如何设计java应用程序的平滑停止
2012-03-05 23:44 11018java应用程序退出的触发机制有: 1.自动结束:应用没有存 ... -
【java并发】juc Executor框架详解
2012-02-26 13:55 12508Executor 框架是 juc 里提供的线程池的实现。 ... -
【java并发】juc高级锁机制探讨
2012-02-23 00:52 8718最近在看一些j ... -
【java并发】基于JUC CAS原理,自己实现简单独占锁
2012-02-14 13:47 7866synchronized的基本原理回 ... -
[NoSQL]MongoDB初体验
2012-01-05 16:06 3968因为未来业务发展的一 ... -
【JVM】HotSpot JVM内存管理和GC策略总结
2011-12-13 22:05 15967JVM的相关知识是学习java ... -
32位机器下的一个java.lang.OutOfMemoryError错误分析
2011-10-17 11:19 2598昨天在本人windows机器( ... -
[监控]Btrace监控简单笔记
2011-09-09 10:57 5062前阵子看了公司网站的一个cache 命中率统计的btrace监 ... -
DBCP数据源配置项记录
2011-09-01 20:22 3000网站最近发生了数据库连接爆掉的问题。排查了下各个应用存在 ... -
【性能】Java BigDecimal和double性能比较
2011-08-28 20:06 14257我们知道 java 里面有个 BigDecimal ... -
【Spring】IOC容器并发条件下,可能发生死锁
2011-08-28 17:07 69391.背景 上周在生产环境应用启 ... -
如果要用java实现算法,一定慎用递归
2011-04-06 20:41 12962现象 : 递归是我们很经典的一种算法实现,可以很好的 ... -
java日志,需要知道的几件事(commons-logging,log4j,slf4j,logback)
2011-02-28 17:12 46409java日志,需要知道的几件事 如果对于comm ... -
JVM问题诊断常用命令:jinfo,jmap,jstack
2010-08-17 17:55 125011.jinfo 描述:输出给定 java ... -
java 浮点数为什么精度会丢失
2010-07-15 22:30 4924由于对float或double 的使用不当,可能会出现精度 ... -
一个枚举类的方法设计
2010-06-21 15:28 1690public enum ActionType { A ... -
java内部字符编码浅析
2010-06-07 21:43 6859java内部字符编码浅析 本周遇到一个 ... -
JDK反射之JDK动态proxy
2010-06-07 21:27 4125JDK动态代理 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...
AIO(Asynchronous Input/Output,异步输入输出)是Java 7引入的一种新的I/O模型,它提供了非阻塞的I/O操作,允许应用程序在等待数据准备就绪时执行其他任务,从而提高了系统的效率和可扩展性。本文将深入探讨JDK1.7...
### JDK 7 (Java Development Kit 7) 版本介绍 #### 一、JDK 7 概述 JDK 7(Java Development Kit 7)是Java平台的一个重要版本,由Oracle公司发布。它是Java SE 7标准的实现,为开发者提供了用于编写Java应用程序...
《深入解析JDK7在Aarch64架构下的应用与实践》 在当前的IT行业中,随着国产化软硬件的快速发展,对支持多种架构的软件需求日益增长。JDK7-aarch64-uos.tar.gz这个压缩包文件,便是针对arm64与aarch64架构的Linux...
JDK7是Oracle公司发布的第七个主要版本,它在JDK6的基础上增加了一些新特性,改进了性能,并修复了许多已知问题。Windows 32位版本的JDK7是专门为在32位操作系统环境下运行而设计的,确保了在这样的平台上开发和运行...
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-...
在ARM64架构下,JDK 7可能包括对ARM...此外,还有其他社区和开发者为ARM64架构提供了JDK 7的构建版本,例如Arch Linux ARM提供了jdk7-openjdk 7.u261_2.6.22-1包,这是一个OpenJDK Java 7开发工具包,适用于aarch64架构
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 32位最新版本,官网下载jdk7 32位最新版本,官网下载jdk7 32位最新版本,官网下载jdk7 32位最新版本,官网下载jdk7 32位最新版本,官网下载jdk7 32位最新版本,官网下载
JDK 7是Java的一个重要版本,它在JDK 6的基础上引入了许多新特性和改进,提升了开发效率和程序性能。 标题中的"jdk 7 32位免安装版"指的是这个压缩包包含的是适用于32位操作系统的Java 7开发工具包,并且是免安装...
Java 7,也被称为JDK 7或Java SE 7 (Java Standard Edition 7),是在2011年发布的,引入了多项重要的新特性和改进。以下是其中的关键亮点: 1. **多语言支持**:Java 7增加了对其他编程语言的支持,如Groovy、Scala...
Java JDK 7是Java开发工具包的一个重要版本,它的全称是Java Development Kit,是用于构建和运行Java应用程序的关键组件。这个PDF学习笔记是开发者深入理解JDK 7特性和功能的重要参考资料。以下是对Java JDK 7的一些...
JDK7是Oracle公司发布的Java平台的一个重要版本,它的全称为"Java SE 7"(Java Standard Edition 7)。这个版本在2011年发布,引入了许多新特性和改进,旨在提升开发效率和增强程序性能。 1. **多语言支持**:JDK7...
jdk7免安装版,可以正常使用,有问题可以联系我,JDK(Java Development Kit)就是Java的开发工具包,无论是开发javase,javaee,javaee.是给Java开发者必须用到的开发工具
JDK7和JDK8是两个不同版本的JDK,每个版本都有其特定的功能和改进,对于开发者来说,了解它们的区别和特性至关重要。 首先,JDK7是Java平台的一个重大更新,正式版本为7u40,它引入了多项新特性,如Try-with-...
jdk7 jdk8 jdk9 jdk10 jdk11 jdk12 jdk13 jdk14 (linux-rpm 64位) 资源共享
8. **JDK7新特性<八> 异步io/AIO** 异步I/O(Asynchronous Input/Output,AIO)提供了非阻塞的读写操作,使得应用程序在等待I/O完成时可以执行其他任务,从而提高了I/O密集型应用的性能。 综上所述,JDK7的新特性...
官网 jdk6,jdk7,jdk8,jdk9,jdk10 windox 32位、64位、linux 32位、64位 百度云。
在这个压缩包里,我们有两个主要的文件:`jdk-7u80-linux-i586.tar.gz` 和 `JDK安装.pdf`。这些文件都是针对Linux操作系统的,特别是对于使用32位(i586)架构的系统。 `jdk-7u80-linux-i586.tar.gz` 是JDK 7更新80...