JAVA在1.4之前仅支持BIO,在1.4之后新增了对NIO的支持。具体的方法在让rt.jar下的Java.nio 目录中。
BIO
在聊聊NIO之前,肯定先需要了解什么是NIO。NIO即non-blocking IO 同步非阻塞IO,在JAVA中NIO也可以称为 new IO。NIO 也是 IO多路复用的基础,下一篇我们就会去了解一下什么是 IO多路复用。 IO多路复用传送门
在了解NIO之前,我们需要去了解一下BIO 即 blocking IO。
public class BIO {
public static void main(String[] args) throws IOException {
ExecutorService executor = Executors.newFixedThreadPool(100);//线程池
ServerSocket serverSocket = new ServerSocket();
serverSocket.bind(new InetSocketAddress(8888));
while (!Thread.currentThread().isInterrupted()) {//主线程死循环等待新连接到来
Socket socket = serverSocket.accept();
executor.submit(new ConnectIOnHandler(socket));//为新的连接创建新的线程
}
}
static class ConnectIOnHandler extends Thread{
private Socket socket;
public ConnectIOnHandler(Socket socket){
this.socket = socket;
}
public void run(){
while(!Thread.currentThread().isInterrupted()&&!socket.isClosed()){
//死循环处理读写事件
try{
InputStream inputStream = socket.getInputStream();//读取数据
inputStream.read();
if(inputStream!=null){
//处理数据
OutputStream outputStream = socket.getOutputStream();
outputStream.write("xxx".getBytes(StandardCharsets.UTF_8));
//写数据
}
}catch (Exception e){
e.printStackTrace();
}
}
}
}
}
BIO模型的优点
1. 就是利用CPU的多核,开启多线程更合理的利用CPU资源。且现在的多线程一般都使用线程池,可以让线程的创建和回收成本相对较低。
2. 在活动连接数不是特别高(小于单机1000)的情况下,这种模型是比较不错的,可以让每一个连接专注于自己的I/O并且编程模型简单,也不用过多考虑系统的过载、限流等问题。
3. 线程池本身就是一个天然的漏斗&