锁定老帖子 主题:JDK7 AIO 初体验
精华帖 (5) :: 良好帖 (15) :: 新手帖 (4) :: 隐藏帖 (10)
|
|
---|---|
作者 | 正文 |
发表时间:2011-08-17
最后修改:2011-08-18
JDK7 AIO初体验
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(); } }
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(); } }
从以上来看AIO的代码简单了很多,至少比NIO的代码实现简单很多。
本文理解暂处于体验阶段,深入学习还待后面,欢迎一起交流。 http://download.oracle.com/javase/tutorial/essential/io/file.html 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-08-17
顶LZ。AIO还没有研究过。看了以后有了一定的了解,有时间去研究下。
|
|
返回顶楼 | |
发表时间:2011-08-18
有钻研精神,赞一个!
|
|
返回顶楼 | |
发表时间:2011-08-18
不错,谢谢分享,其实我一直觉得之前的NIO 和现在的AIO 实现的原理类似,有两个线程池,一个是负责接收,一个是负责处理,不知道对不对,希望和LZ讨论
|
|
返回顶楼 | |
发表时间:2011-08-18
能再加上些适用场景就更好了
|
|
返回顶楼 | |
发表时间:2011-08-18
我点了隐藏,这几天看到帖子我都点隐藏,因为我不知道这里隐藏的标准是什么,既然那么多人把我觉得不该隐藏的点了隐藏,那我见帖子就点隐藏也不足为奇。
楼主你就不能好好的用国语么,专业术语用原版的没有非议,但是“release”难道就没有对应的中文?!!! |
|
返回顶楼 | |
发表时间:2011-08-18
你基本功真不行
|
|
返回顶楼 | |
发表时间:2011-08-18
003 写道 我点了隐藏,这几天看到帖子我都点隐藏,因为我不知道这里隐藏的标准是什么,既然那么多人把我觉得不该隐藏的点了隐藏,那我见帖子就点隐藏也不足为奇。
楼主你就不能好好的用国语么,专业术语用原版的没有非议,但是“release”难道就没有对应的中文?!!! 我觉得用release这个单词没什么不好的地方,反而是我感觉你有点2的感觉,楼主钻研分享精神值得我学习。 |
|
返回顶楼 | |
发表时间:2011-08-18
在unix网络编程的定义里异步和非异步概念的区别就是实际的IO操作是否是由操作系统完成。如果是就是异步,如果不是就是同步。
这段话会误导读者, 无论异步还是同步, 都是有系统发起的io操作, 关于 同步,异步,阻塞,非阻塞的概念 参见 http://www.iteye.com/topic/472333 , 解释的比较清楚 |
|
返回顶楼 | |
发表时间:2011-08-18
9981661 写道 在unix网络编程的定义里异步和非异步概念的区别就是实际的IO操作是否是由操作系统完成。如果是就是异步,如果不是就是同步。
这段话会误导读者, 无论异步还是同步, 都是有系统发起的io操作, 关于 同步,异步,阻塞,非阻塞的概念 参见 http://www.iteye.com/topic/472333 , 解释的比较清楚 表述有误,谢谢指正! |
|
返回顶楼 | |