Режимы блокировки и неблокирования в Java NIO

#java

#java

Вопрос:

Я самоучка Java, и я немного смущен при реализации этой функциональности Java NIO. Меня смущает режим блокировки Java NIO. Является ли целью установки неблокирующего режима для селектора, чтобы определить, что канал готов к операциям ввода-вывода? И если предположить, что режим установлен на «true», будет ли селектор определять канал или нет? Надеюсь, кто-нибудь сможет мне это объяснить, дайте мне пример кода или любые предложения, я был бы очень благодарен. Большое спасибо

 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);
    ....
    }
 

Ответ №1:

В режиме блокировки, когда клиент взаимодействует с сервером, такие вызовы, как send, receive, connect (только TCP) и accept (только TCP), будут блокироваться на неопределенный срок, пока эта операция не будет выполнена. С другой стороны, в неблокирующем режиме эти функции будут немедленно возвращены.

Например, когда клиент вызывает метод read() для чтения данных с сервера, поток блокируется до тех пор, пока данные не будут доступны. При некоторых обстоятельствах такая ситуация нежелательна. Вместо этого мы можем использовать период ожидания для выполнения какой-либо другой задачи. Затем клиентский сокет может уведомлять, когда данные доступны. Другая проблема заключается в том, что при соединении с несколькими сокетами каждый клиент представляет собой отдельный поток. Следовательно, существуют накладные расходы на поддержание пула клиентских потоков.

Теперь, чтобы ответить на ваш вопрос, вы можете выбрать, хотите ли вы использовать блокирующий или неблокирующий режим в своем приложении. Если вы установите, как показано ниже

   serverSocketChannel.configureBlocking(false);
 

тогда сервер будет работать в неблокирующем режиме, в противном случае он будет работать в режиме блокировки по умолчанию.

Вот несколько статей для справки

  1. Блокирующие и неблокирующие сокеты
  2. Неблокирующее программирование сокетов на Java