java - 为什么阻塞 IO API 在早期的 Java 中不是问题?

标签 java multithreading io nio

原始 Java IO API 是同步的。从 1.4 开始,Java 有了 NIO API,它是异步的。本来设计用于高负载系统的系统怎么会不关心性能和资源使用效率呢?

从技术上讲,这意味着阻塞的线程会消耗内存(~1-2Mb)并且不会执行任何有用的操作。我也确实理解为什么它被认为是无效的:只是因为工作实际上不是由 CPU 完成的,而是由网卡或磁盘完成的,而且它们没有线程。所以理论上实际上没有理由阻塞线程。然而,大多数 Java 套接字读取示例都使用阻塞的读取线程并等待传入​​的字符。

所以我想要技术解释为什么这在早期的 Java 中不是一个问题。

PS。对我来说,实际的问题是“使用什么网络和磁盘 API:同步还是异步?”。作为 Java 开发人员,我不太关心它,但现在我们团队中有 C++ 开发人员,他们认为同步 Java IO 是“严重的 Java 问题”。

PPS。我真的很喜欢 Kotlin 协程概念作为这个问题的解决方案。

最佳答案

JVM 对非阻塞 IO 的实现在很大程度上取决于操作系统对其的支持,而在 Java 的早期,操作系统的支持是参差不齐且不统一的。这从来都不是“不是问题”。

关于java - 为什么阻塞 IO API 在早期的 Java 中不是问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56925076/

相关文章:

java - "locked"在 Java 堆栈跟踪中意味着什么?

c - 在 C 中为线程同步结构

C++ 不同线程在 FreeBSD 10 上具有相同的线程 ID

java - servlet如何工作?实例化, session ,共享变量和多线程

Python游戏编程: is my IO object a legitimate candidate for being a global variable?

ios - 在 TableView 中选择一个单元格并更改大小

java - Android Java 静态泛型调用

java - 更改 spring petclinic 中根目录的名称

c++ - 何时为 I/O (C++) 构建您自己的缓冲系统?

java - Hbase FilterList 作为 MUST_PASS_ONE 并带有两个 RowFilters 返回所有内容