java中的非阻塞IO和异步IO
所属分类 java
浏览量 1465
Java NIO Buffer Channel Selector
NIO , JDK1.4,New IO,Non-Blocking IO
NIO2,JDK7,More New IO,Asynchronous IO, NIO2
非阻塞 IO 核心在于使用一个 Selector 来管理多个通道,
可以是 SocketChannel,也可以是 ServerSocketChannel,将各个通道注册到 Selector 上,指定监听的事件。
之后可以只用一个线程来轮询这个 Selector,看看上面是否有准备好的通道,当通道准备好可读或可写,然后才去开始真正的读写
select 支持注册 FD_SETSIZE(1024) 个 socket
poll 1997 年,出现了 poll 作为 select 的替代者,最大的区别就是,poll 不再限制 socket 数量
select 和 poll 都有一个共同的问题,只会告诉你有几个通道准备好了,但是不会告诉你具体是哪几个通道。
所以一旦知道有通道准备好以后,需要自己进行扫描,时间复杂度 O(n) 效率低
epoll 2002 年随 Linux 内核 2.5.44 发布,epoll 能直接返回准备好的通道,时间复杂度 O(1)。
java NIO2 异步 IO 由一个线程池来负责执行任务,然后使用回调或主动去查结果。
异步 IO 主要是为了控制线程数量,减少过多的线程带来的内存消耗和 CPU 在线程调度上的开销。
tomcat8.5 使用 org.apache.coyote.http11.Http11Nio2Protocol
性能更高, 使用更少的线程
tomcat8.5压测记录
JDK 使用并发包中的线程池来管理任务 AsynchronousChannelGroup
Windows 提供 I/O Completion Ports 方案, IOCP
Windows JDK 直接 使用 IOCP ,使操作系统优化 IO 操作。
Linux 也有异步 IO 系统实现,但是限制比较多,性能也一般,所以 JDK 采用了自建线程池的方式。
AsynchronousSocketChannel
AsynchronousServerSocketChannel
AsynchronousFileChannel
java.util.concurrent.Future
future.isDone();
判断操作是否已经完成,包括了正常完成、异常抛出、取消
future.cancel(true);
取消操作,方式是中断。参数 true 说的是,即使这个任务正在执行,也会进行中断。
future.isCancelled();
是否被取消,只有在任务正常结束之前被取消,这个方法才会返回 true
future.get();
获取执行结果,阻塞。
future.get(10, TimeUnit.SECONDS);
阻塞获取结果,指定超时时间。
CompletionHandler 回调函数
java.nio.channels.CompletionHandler
public interface CompletionHandler {
void completed(V result, A attachment);
void failed(Throwable exc, A attachment);
}
使用 attachment 传递参数
AsynchronousServerSocketChannel listener = AsynchronousServerSocketChannel.open().bind(null);
// accept 方法的第一个参数可以传递 attachment
listener.accept(attachment, new CompletionHandler() {
public void completed(
AsynchronousSocketChannel client, Object attachment) {
//
}
public void failed(Throwable exc, Object attachment) {
//
}
});
上一篇
下一篇
system.gc要点整理
String.intern要点整理
/proc/PID/status进程信息说明
NIO JMX BufferPool内存监控
AtomicInteger源码分析要点
unsafe要点