Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java IO是阻塞IO吗?_Java_Sockets_Networking_Io_Websocket - Fatal编程技术网

Java IO是阻塞IO吗?

Java IO是阻塞IO吗?,java,sockets,networking,io,websocket,Java,Sockets,Networking,Io,Websocket,我知道对于一个线程(一个套接字),我不能同时执行read()或write(),或者可以吗 但是,如果我创建两个线程,每个线程分别处理read()和write()?我不知道在低级视图中,read()和write()是否会获得套接字锁,因此一次只允许执行一个操作?会吗 我使用Windows作为平台,但也想知道在Unix机器上有什么不同 我问这个问题是因为我很困惑,既然两个线程可以让我们同时读()和写(),为什么我们需要非阻塞IO?因为创建数千个线程会给JVM和系统资源带来压力。使用异步IO,您可以让

我知道对于一个线程(一个套接字),我不能同时执行read()或write(),或者可以吗

但是,如果我创建两个线程,每个线程分别处理read()和write()?我不知道在低级视图中,read()和write()是否会获得套接字锁,因此一次只允许执行一个操作?会吗

我使用Windows作为平台,但也想知道在Unix机器上有什么不同


我问这个问题是因为我很困惑,既然两个线程可以让我们同时读()和写(),为什么我们需要非阻塞IO?

因为创建数千个线程会给JVM和系统资源带来压力。使用异步IO,您可以让几个线程监视大量连接,而且效率更高。

线程是非常昂贵的资源。我们应该尽量节约和有效地使用它们,以最大限度地利用它们

NIO允许我们在同一个线程上打开多个套接字。基本上,一个线程上可以有1000个套接字连接,而不是1000个线程

让我们以现实世界为例。Tomcat是一个带有JSP/Servlet容器的Web服务器。它支持阻塞IO和非阻塞IO。使用阻塞IO,它可以在5K HTTP连接上最大化,但使用NIO,当有足够的RAM内存可用时,它可以达到20K HTTP连接

我知道对于一个线程(一个套接字),我不能同时执行read()或write(),或者可以吗

当然不是。一个线程一次只能调用一个方法。这个问题毫无意义

但是,如果我创建两个线程,每个线程分别处理read()和write()?我不知道在低级视图中,read()和write()是否会获得套接字锁,因此一次只允许执行一个操作?会吗

他们不需要锁。TCP是全双工的。您可以在同一个套接字上读写。同时,

我使用Windows作为平台,但也想知道在Unix机器上有什么不同

没有


我问这个问题是因为我很困惑,既然两个线程可以让我们同时读()和写(),为什么我们需要非阻塞IO

下定决心吧。首先你问它是否可能,现在你(正确地)说它是

NIO允许您在同一线程中处理多个套接字。这样做的目的是保护线程,例如在必须处理数十万个连接的服务器中

对于一个线程(一个套接字),我不能同时执行read()或write()

你可以同时读写,但是你可以在同一个线程中读写。如果您希望写入已知数量的数据或消息,并且希望返回已知数量的数据或消息,则可以在同一线程中写入然后读取

e、 如果您有一个简单的服务器进程,您可以使用单个线程读取请求和写入响应


我将使用阻塞IO进行不超过几百个连接。如果您有几十个或更少的连接,那么非阻塞IO可能不值得付出额外的复杂性。

阻塞和锁定之间有区别。您可以使用
套接字执行并发阻塞I/O
“既然两个线程都可以让我们同时读()和写(),为什么我们需要非阻塞IO?”因为只有一个线程的代码更简单。你的标题基本上与你的问题无关。