Java IO是Java语言中处理输入输出的模块,分为阻塞IO和非阻塞IO两种方式,阻塞和非阻塞主要影响代码的执行效率和线程的使用效率。
阻塞IO
阻塞IO会让当前的线程在执行输入/输出操作时阻塞(即暂停),直到IO操作完成后再回到执行状态。在阻塞IO模式下,如果当前线程阻塞了,那么这个线程就不能再执行其他任务了,直到IO操作完成。
// 阻塞IO方式读取文件 FileInputStream fileInputStream = new FileInputStream("test.txt"); byte[] bytes = new byte[1024]; int read = fileInputStream.read(bytes);
非阻塞IO
相对于阻塞IO而言,非阻塞IO则不会让当前的线程在执行输入/输出操作时暂停,而是继续执行其他任务,直到IO操作完成再返回执行状态。由于不阻塞当前线程,因此在IO操作执行期间,当前线程可以继续执行其他任务,提高了程序的运行效率。
// 非阻塞IO方式读取文件 FileInputStream fileInputStream = new FileInputStream("test.txt"); // 判断是否有可读数据 while (fileInputStream.available() >0) { byte[] bytes = new byte[1024]; // 读取数据 fileInputStream.read(bytes); }
阻塞IO和非阻塞IO的使用场景
阻塞IO主要适用于连接数较少的情况,比如传统的B/S模式。因为在阻塞IO模式下,当一个IO操作执行时,整个线程是阻塞的,这样就需要为每个链接都创建一个线程来处理连接请求,会导致服务器效率低下。
非阻塞IO则特别适用于高并发、连接数较多的情况,比如NIO框架。在非阻塞方式下,一个线程可以管理多个连接,服务器的性能就会大大提高。
结论
只有在需要处理大量连接的情况下,才需要使用非阻塞IO。在仅仅需要处理少量的连接时,使用阻塞IO即可。无论是阻塞IO还是非阻塞IO,都可根据具体的使用场景选择合适的方法。