Является ли сокет принять метод блокировки метода в этой ситуации - PullRequest
0 голосов
/ 25 мая 2018

Просто короткий и сладкий.Я пытаюсь создать чат-клиент, поэтому у меня есть пул потоков, управляющий соединениями сокетов на сервере.Если я использую:

    while(true) {
        thrdPool.execute(new ServChatSocket(servSocket.accept(), InOutMan));
    }

Будет ли этот блок ServChatSocket создаваться и добавляться в пул, пока не получит соединение, добавить странный нарушенный ServChatSocket в пул с неожиданными результатами, илиВыдает какую-то повторяющуюся ошибку, пока не получит входящее соединение?

Должен ли я использовать оператор if в блоке while, чтобы проверить, есть ли объект, готовый для соединения, перед передачей в thrdPool?Что-то вроде:

    while(true) {
        if(s = servSocket.accept()) {
            thrdPool.execute(new ServChatSocket(s, InOutMan));
        }
    }

Помимо предотвращения вышеупомянутых ошибок (если они есть), это будет считаться лучшим, более чистым кодом?

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Это простой вопрос порядка вычисления.

thrdPool.execute(new ServChatSocket(servSocket.accept(), InOutMan));

- это не что иное, как обычный вызов функции.В Java нет магии, которая пытается обнаружить, что когда вы пишете это, это связано с запуском потока.Нет, задача метода execute () - запускать потоки внутри себя, но это только внутри себя.

Итак, здесь вы вызываете execute () с параметром.Этот параметр:

new ServChatSocket(servSocket.accept(), InOutMan)

, поэтому он должен быть оценен перед вызовом execute ().

Это конструктор, имеющий два параметра, которые должны быть оценены до вызова конструктора.Один из этих параметров -

servSocket.accept()

, который является вызовом метода, который блокирует, пока клиент не соединится и соединение сокета не будет принято.

Так что да, он будет блокироваться.Нет создания потока, пока он не будет готов, нет ошибки.

Помимо предотвращения вышеупомянутых ошибок (если они есть), это будет считаться лучшим, более чистым кодом?

, если() может только вычислять логическое выражение, поэтому ваш пример не сработает.И, что более важно, нет if ().Когда вы вызываете accept (), вы либо получаете в ответ действительный экземпляр Socket, либо ваша программа умирает, пытаясь, и когда он не работает, код не выполняется.

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

0 голосов
/ 25 мая 2018

Будет ли этот блок ServChatSocket'ов создаваться и добавляться в пул до тех пор, пока он не получит соединениепул с неожиданными результатами

Нет.

или выдает какую-то повторяющуюся ошибку, пока не получит входящее соединение?

Нет.

Должен ли я использовать оператор if в блоке while, чтобы проверить, есть ли объект, готовый для подключения, перед передачей в thrdPool?

Нет.ServerSocket.accept() никогда не возвращает ноль.

...