Как вы делаете поток простоя в Java при использовании пула потоков? - PullRequest
1 голос
/ 27 марта 2019

Я работаю над решением сервер / клиент, которое создает новый серверный поток для каждого подключенного клиента (добавляет его в пул потоков).Серверный поток ожидает сообщения от связанного клиента, вызывая readLine() в потоке ввода сокетов клиентов.Если я установлю пул потоков на 1 и подключу второй клиент, он не будет выполняться пулом потоков, пока первый поток не будет закрыт.У меня сложилось впечатление, что пул потоков будет автоматически простаивать поток, если он просто ожидает readLine (), но я думаю, что это не так.Как мне создать такую ​​программу?

Это серверный цикл, который создает новые серверные потоки, подключенные к клиенту:

private final static Executor executor = Executors.newFixedThreadPool(MAX_CLIENTS);

while (true) {
    clientSocket = serverSocket.accept();
    executor.execute(new ChatServer(clientSocket, allClients));
}

И метод запуска работает так:

socketReader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())

while(true) {
    inputLine = socketReader.readLine();
    //then send input line to all clients
}

Как уже говорилось, если FixedThreadPool уже запущен MAX_CLIENTS, новые клиенты не будут выполняться.

1 Ответ

0 голосов
/ 27 марта 2019

С вашим текущим дизайном Вы будете исчерпывать потоки, поскольку число клиентов увеличивается.Если ваш пул потоков имеет размер 20 потоков, вы не можете обрабатывать 21 клиента одновременно.Поскольку операции с сокетами являются блокирующими операциями. (И ваш класс ChatServer будет держать выполняющийся поток занятым циклом while (true))

Вы должны проверить AsynchronousSocketChannel и AsynchronousServerSocketChannel классыкоторые поддерживают асинхронные операции ввода-вывода.Чтобы иметь возможность использовать эти классы, вам необходимо изменить большую часть логики взаимодействия вашего клиент-сервера.

Для получения подробной информации и примера использования этих классов просмотрите следующие ссылки.

https://www.javaworld.com/article/2853780/socket-programming-for-scalable-systems.html

https://webtide.com/on-jdk-7-asynchronous-io/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...