我看到很多关于旧Java io模型和新的java nio模型的比较,前者是同步/阻塞的,后者是异步/非阻塞的。因为NIO是非阻塞的,所以在需要处理大量并发连接但不想分配大量线程(由于上下文切换/内存使用而无法扩展)时,它比java io更适合。
我对这个观点的问题是,将IO与NIO进行比较时,总是给出IO使用每个连接一个线程的示例。使用java IO的开发人员是否可以简单地为阻塞IO操作(例如文件读取或数据库查询)分配有限数量的线程(线程池)并将它们排队?假设我正在使用java的ServerSocket类从头开始构建http服务器。假设我从客户端收到需要进行数据库查询的请求,由于JDBC规范,这是一个阻塞操作。我不能简单地将数据库查询排队到ThreadPool中,并在池完成处理时提供回调来运行任务吗?当然,我正在分配线程来处理IO绑定请求,但线程的数量是有限的。由于IO操作通常是同步的(至少在某种程度上),尝试为每个数据库查询或文件读取/写入分配一个线程是没有意义的。
这样一来,您就可以获得线程和异步编程的好处,而无需分配过多的线程。
我认为这种模型唯一的弱点是,如果所有IO绑定操作都被卡住了(可能是由于编程错误),那么将来排队的请求将被搁置,直到它们解除卡住或超时。主要逻辑仍然是并发的,但IO不是。
所以问题是:NIO是否解决了上述模型无法解决的任何问题(除了我刚提到的潜在弱点)?
我对这个观点的问题是,将IO与NIO进行比较时,总是给出IO使用每个连接一个线程的示例。使用java IO的开发人员是否可以简单地为阻塞IO操作(例如文件读取或数据库查询)分配有限数量的线程(线程池)并将它们排队?假设我正在使用java的ServerSocket类从头开始构建http服务器。假设我从客户端收到需要进行数据库查询的请求,由于JDBC规范,这是一个阻塞操作。我不能简单地将数据库查询排队到ThreadPool中,并在池完成处理时提供回调来运行任务吗?当然,我正在分配线程来处理IO绑定请求,但线程的数量是有限的。由于IO操作通常是同步的(至少在某种程度上),尝试为每个数据库查询或文件读取/写入分配一个线程是没有意义的。
这样一来,您就可以获得线程和异步编程的好处,而无需分配过多的线程。
我认为这种模型唯一的弱点是,如果所有IO绑定操作都被卡住了(可能是由于编程错误),那么将来排队的请求将被搁置,直到它们解除卡住或超时。主要逻辑仍然是并发的,但IO不是。
所以问题是:NIO是否解决了上述模型无法解决的任何问题(除了我刚提到的潜在弱点)?