Это простой вопрос порядка вычисления.
thrdPool.execute(new ServChatSocket(servSocket.accept(), InOutMan));
- это не что иное, как обычный вызов функции.В Java нет магии, которая пытается обнаружить, что когда вы пишете это, это связано с запуском потока.Нет, задача метода execute () - запускать потоки внутри себя, но это только внутри себя.
Итак, здесь вы вызываете execute () с параметром.Этот параметр:
new ServChatSocket(servSocket.accept(), InOutMan)
, поэтому он должен быть оценен перед вызовом execute ().
Это конструктор, имеющий два параметра, которые должны быть оценены до вызова конструктора.Один из этих параметров -
servSocket.accept()
, который является вызовом метода, который блокирует, пока клиент не соединится и соединение сокета не будет принято.
Так что да, он будет блокироваться.Нет создания потока, пока он не будет готов, нет ошибки.
Помимо предотвращения вышеупомянутых ошибок (если они есть), это будет считаться лучшим, более чистым кодом?
, если() может только вычислять логическое выражение, поэтому ваш пример не сработает.И, что более важно, нет if ().Когда вы вызываете accept (), вы либо получаете в ответ действительный экземпляр Socket, либо ваша программа умирает, пытаясь, и когда он не работает, код не выполняется.
Но сначала вам, вероятно, следует вызвать accept (), сохранитеВставьте переменную и затем выполните execute ().С точки зрения исполнения это то же самое, что поместить все в одну строку.Но тот факт, что вы задаете эти вопросы, показывает, что нашему человеческому мозгу немного сложно понять эти строки и правильно их прочитать.Ты не одинок.Проще разбить последовательные шаги на несколько инструкций.