jdk7 Asynchronous I/O

AIO参考(参考链接) 主要思想是:read(buffer, callback)函数立即返回,当keneral完成IO操作之后,会调用回调函数,同时数据已经写入此buffer中了。 在java/nio/channels/下的几个AsynchronousXXXChannel有完成此功能: 实现AIO的两种方式: 1,Future read(ByteBuffer dst);调用立即返回,然后可作为future.get()来操作,或者把future传到Executor中去。 2,read(ByteBuffer dst, CompletionHandler handler); 调用立即返回,当keneral完成IO操作,将数据拷贝到dst中之后,会调用CompletionHandler(在后台重新启动一个线程,不会block主线程) 对于第二中回调函数的方式,调用CompletionHandler的实现方式分为两种: 1,Fixed thread pool
thread pool中每个线程都在等待是否有自己的IO事件,当等到的时候,把数据拷贝到Buffer中,处理CompletionHandler ,处理结束在回到thread pool中继续等待 QQ截图20130605002812 可能问题:如果CompletionHandler 函数会阻塞,那么可能造成thread pool没有线程可用来从keneral中拷贝数据。
2,Cached or custom thread pool 由keneral内部不可见的线程池来等待IO事件,当等到的时候,keneral内部拷贝数据到buffer中,然后从thread pool中取得一个thread,让这个thread 来处理CompletionHandler,处理结束之后把这个thread再放回thread pool QQ截图20130605003210 可能问题:同上,CompletionHandler 函数不要阻塞,否则可能造成keneral拷贝了数据到buffer中,但是没有thread可以处理,这样可能造成OOM;另外,如果同时有大量的数据到来,会把keneral撑爆OOM 参考(http://openjdk.java.net/projects/nio/presentations/TS-4222.pdf

Published: June 04 2013