BIO通信模型图
缺点:缺乏弹性伸缩能力,线程是非常宝贵的资源,为每个请求创建、销毁线程会在请求数膨胀时出现性能问题,甚至堆栈溢出、创建线程失败,最终导致进程宕机。
改进用线程池
NIO的关键概念
缓冲区Buffer
- ByteBuffer(最常用)
- CharBuffer
- ShortBuffer
- IntBuffer
- LongBuffer
- FloatBuffer
- DoubleBuffer
通道Channel
- SelectableChannel:针对网络读写
- FileChannel:针对文件
多路复用器Selector
Selector会不断轮询在其上注册的Channel,如果某个Channel上面有新的TCP连接接入、读和写事件,这个Channel就处于就绪状态,会被Selector轮询出来,然后通过SelectionKey可以获取就绪Channel的集合,进行后续的I/O操作。JDK使用epoll()实现多路复用。