首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java与NIO与任务队列

Java与NIO与任务队列
EN

Stack Overflow用户
提问于 2017-03-09 18:34:17
回答 2查看 859关注 0票数 6

我已经看到了许多主题,将旧的Java模型与新的java nio模型进行比较,前者是同步/阻塞,后者是异步/非阻塞。由于nio是非阻塞的,所以当大量并发连接需要并发处理时,它比java更适合,而不需要分配大量的线程,而这些线程由于上下文切换/内存使用而不能很好地扩展。

这个论点的问题是,IO和NIO的比较总是给出每个连接使用线程的IO示例。使用java的开发人员可以简单地分配有限数量的线程(线程池)来阻塞IO操作(即文件读取或数据库查询)并对它们进行排队吗?假设我正在使用java的ServerSocket类从底层构建一个http服务器。假设我收到客户端的请求,它要求我进行数据库查询,这是由于JDBC规范导致的阻塞操作。我能不能简单地将数据库查询排队到一个ThreadPool,并在池处理完它时给作业一个回调以运行?当然,我正在分配线程来处理io边界请求,但是线程的数量是有限的。由于IO操作通常是同步的(在某种程度上),因此尝试为每个db查询分配一个线程,或者为每个文件的读/写分配一个线程都是没有意义的。

这样,您就可以获得线程和异步编程的好处,而不需要分配过多的线程。

我在这个模型中看到的唯一弱点是,如果所有io绑定操作都被卡住(可能是由于编程错误),那么未来排队的请求将被搁置,直到它们被解除,或者超时。主逻辑仍然是并发的,但IO不是。

那么,问题: NIO是否解决了我前面描述的模型无法解决的问题(除了我刚才提到的潜在弱点)?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-09 19:24:15

当然,您可以使用一个池和有限数量的线程来处理您自己的I/O,但是您基本上是在复制NIO为您提供的内容,但不能利用本地API。

您的系统无法很好地处理的问题之一是,有数千个套接字执行缓慢的I/O操作,这是处理服务器推送、BitTorrent客户端或可能非常繁忙的内容服务器所需的。

更传统的请求/响应系统在您的解决方案中可以很好地工作,但是同样地,它们也可以很好地处理每个请求的线程,因为通常遇到的第一个瓶颈将是CPU或内存消耗。

票数 4
EN

Stack Overflow用户

发布于 2017-03-10 01:14:39

如果使用您所描述的模型创建具有N个线程数的web服务器,恶意参与者可以打开N个连接,而不发送任何数据。现在,您的服务器被完全锁定,无法完成有意义的工作。NIO带来的是选择器,它允许您同时等待多个连接。使用这个原语,您可以创建一个线程,在上等待当前连接的所有。没有一个连接能够占据整个线程的执行状态,因为您只将该作业分配给了单个线程。系统上的所有其他线程现在都可以根据需要处理传入的数据。

即使假设正常的、非恶意的行为者,单线程/阻塞调用模型也可能崩溃。正确的是,IO操作可能会被卡住,并可能导致系统中的故障。但是,某些客户端(比如聊天会话中的持久客户端)可能会长时间空闲。对服务器的所有请求不一定是即时的和完整的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42702951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档