【问题标题】:Blocking and Non-Blocking Modes in Java NIOJava NIO 中的阻塞和非阻塞模式
【发布时间】:2021-12-06 02:44:07
【问题描述】:

我是自学 Java,在实现 Java NIO 的这个功能时有点困惑。我对 Java NIO 的阻塞模式感到困惑。设置非阻塞模式的目的是为了让选择器检测通道是否已准备好进行 I/O 操作?并假设模式设置为“真”,选择器是否会检测到通道?希望有人可以向我解释,给我示例代码或任何建议,我将不胜感激。非常感谢

public class NioServer {

public void start() throws IOException {

    Selector selector = Selector.open();

    ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();

    serverSocketChannel.bind(new InetSocketAddress(8000));

    // configureBlocking is problem
    serverSocketChannel.configureBlocking(false);
    ....
    }

【问题讨论】:

    标签: java


    【解决方案1】:

    在阻塞模式下,当客户端与服务器调用,如发送、接收、连接(仅限 TCP)和接受(仅限 TCP)时,将无限期地阻塞,直到执行该操作。另一方面,在非阻塞模式下,这些函数将立即返回。

    例如,当客户端调用 read() 方法从服务器读取数据时,线程会被阻塞,直到数据可用。这种情况在某些情况下是不可取的。相反,我们可以做的是利用等待时间来做一些其他的任务。然后,客户端套接字可以在数据可用时发出通知。另一个问题是,在多套接字连接中,每个客户端都是一个单独的线程。因此,维护客户端线程池会产生开销。

    现在回答您的问题,您可以在应用程序中控制是否需要阻塞或非阻塞模式。如果你像下面这样设置

      serverSocketChannel.configureBlocking(false);
    

    那么服务器将以非阻塞模式运行,否则默认以阻塞模式运行。

    这里有一些文章供参考

    1. Blocking and Non-Blocking Sockets
    2. Non-blocking Socket Programming in Java

    【讨论】:

      猜你喜欢
      • 2012-01-01
      • 2011-07-14
      • 2014-01-11
      • 2016-07-06
      • 2010-12-16
      • 2018-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多