Шаг 157.
Язык программирования Java.
Одновременная обработка нескольких соединений

На этом шаге мы узнаем с помощью чего можно обработать одновременно несколько соединений

Ранее мы создавали серверное приложение, которое способно обслужить одновременно только одного клиента. Для того, чтобы обслужить одновременно несколько клиентов, нужны знания по параллельному программированию. На этом шаге мы только приведем способ создания отдельных потоков (с остальными возможностями параллельного программирования в Java мы познакомимся позднее).

Для того, чтобы создать отдельный поток, необходимо создать объект типа Thread. Сделать это можно следующим способом:

class MyThread extends Thread {
    
    @Override
    public void run() {
        // Тут какая-то работа
    }
}

Когда произойдет соединение клиента с сервером, нужно создать отдельный поток для этого соединения. Но если таких соединений будет очень много, например, несколько десятков тысяч, то возникает потребность в очереди обработки соединений. Так как если ее не обеспечить, то будет потребляться много ресурсов. Для создания очереди в Java есть класс Executors. Он содержит различные статические функции для создания различных типов очередей. Мы будем использовать функцию newFixedThreadPool (с остальными функциями мы познакомимся, когда будем рассматривать параллельное программирование). Данная функция создает очередь потоков, при этом одновременно может выполняться фиксированное число потоков. Например, при использовании следующей очереди будет выполняться одновременно не более 4 потоков:

ExecutorService executorService = Executors.newFixedThreadPool(4);

Когда создается новый поток для соединения, его нужно положить в очередь. Для этого нужно использовать функцию execute.

После того, как вам уже не нужна очередь потоков, необходимо обязательно вызвать функцию shutdown. Дальнейшая работа с очередью будет невозможна, в противном случае будет брошено исключение.

На следующем шаге мы приведем пример сервера, который может обрабатывать одновременные соединения

Предыдущий шаг Содержание Следующий шаг