同步/异步
侧重点在于是否两线并行,在做一件事a的时候,可以先让这件事a自己进行,自己去做另外一件事b,a进行到一定程度的时候通知到自己,自己在根据事情a的通知去处理接下来的事情。
阻塞/非阻塞
侧重点在于在做其中一件事a的时候,能否暂时暂停a去做另外一件事b,a事情会在那等待,自己在做事情b的时候经常回来看看事情a是否已经到了满足一定条件的时候,满足的话那么继续接下来的事情,不满足那么继续回去干事情b,事情a继续等待条件满足的时候。
IO关乎同步异步的概念,socket处理关乎阻塞非阻塞的概念。
BIO一个连接一个线程,不管有没有实际的事情在处理,socket在accept、read、write的时候都在等待,占用着线程
Java对BIO、NIO、AIO的支持:
Java BIO : 同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。
Java NIO : 同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。
Java AIO(NIO.2) : 异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理,
NIO是一个有效请求一个线程,即socket有可读取的数据时会使用线程,没有可用数据时,是不占用线程资源的
NIO的概念是非阻塞IO,其关注点在于“阻塞”二字,也就是我在处理一件事情的时候,能否暂时放下去处理另一件事,所以解决了在read、accept、write的时候线程不用一直等待而去处理其他的任务,非阻塞是指在处理socket缓冲区相关数据的时候是非阻塞的,而IO的时候还是同步的
而AIO概念是异步IO,关注点在于“异步”二字,是线程在到IO的时候,不用等待,可以去做其他的事情,IO继续IO相关的处理,两部并行,IO结束后通知线程回来继续接下来的任务处理
原文:https://www.cnblogs.com/promise-7/p/12574499.html