Учебники

Apache HttpClient — несколько потоков

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

Вы можете выполнять запросы из нескольких потоков, написав многопоточную программу HttpClient.

Если вы хотите последовательно выполнить несколько клиентских запросов из потоков, вам необходимо создать ClientConnectionPoolManager . Он поддерживает пул HttpClientConnections и обслуживает несколько запросов от потоков.

Диспетчер соединений объединяет соединения в зависимости от маршрута. Если у менеджера есть соединения для определенного маршрута, он обслуживает новые запросы в этих маршрутах, арендуя существующее соединение из пула, вместо того, чтобы создавать новое.

Выполните шаги для выполнения запросов из нескольких потоков —

Шаг 1 — Создание диспетчера клиентских подключений

Создайте диспетчер пулов клиентских подключений, создав экземпляр класса PoolingHttpClientConnectionManager .

PoolingHttpClientConnectionManager connManager = new
   PoolingHttpClientConnectionManager(); 

Шаг 2 — Установите максимальное количество соединений

Установите максимальное количество соединений в пуле, используя метод setMaxTotal () .

//Set the maximum number of connections in the pool
connManager.setMaxTotal(100); 

Шаг 3 — Создание объекта ClientBuilder

Создайте объект ClientBuilder , установив диспетчер соединений с помощью метода setConnectionManager (), как показано ниже:

HttpClientBuilder clientbuilder =
HttpClients.custom().setConnectionManager(connManager);

Шаг 4 — Создание объектов запроса HttpGet

Создайте экземпляр класса HttpGet, передав нужный URI его конструктору в качестве параметра.

HttpGet httpget1 = new HttpGet("URI1");
HttpGet httpget2 = new HttpGet("URI2");
. . . . . . . . . . . . 

Шаг 5 — Реализация метода запуска

Убедитесь, что вы создали класс, сделали его потоком (либо путем расширения класса потока, либо путем реализации интерфейса Runnable) и реализовали метод run.

public class ClientMultiThreaded extends Thread {
   public void run() {
      //Run method implementation . . . . . . . . . .
   }
}

Шаг 6 — Создание объектов Thread

Создайте объекты потока, создав экземпляр класса Thread (ClientMultiThreaded), созданного выше.

Передайте объект HttpClient, соответствующий объект HttpGet и целое число, представляющее идентификатор для этих потоков.

ClientMultiThreaded thread1 = new ClientMultiThreaded(httpclient,httpget1, 1);
ClientMultiThreaded thread2 = new ClientMultiThreaded(httpclient,httpget2, 2);
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Шаг 7 — Начните и присоединяйтесь к темам

Запустите все потоки, используя метод start (), и соедините их, используя метод join () .

thread1.start();
thread2.start();
. . . . . . . .
thread1.join();
thread2.join();
. . . . . . . . . . . .

Шаг 8 — Выполнить реализацию метода

В методе run выполните запрос, получите ответ и распечатайте результаты.

пример

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

import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.util.EntityUtils;

public class ClientMultiThreaded extends Thread {
   CloseableHttpClient httpClient;
   HttpGet httpget;
   int id;
 
   public ClientMultiThreaded(CloseableHttpClient httpClient, HttpGet httpget,
   int id) {
      this.httpClient = httpClient;
      this.httpget = httpget;
      this.id = id;
   }
   @Override
   public void run() {
      try{
         //Executing the request
         CloseableHttpResponse httpresponse = httpClient.execute(httpget);

         //Displaying the status of the request.
         System.out.println("status of thread "+id+":"+httpresponse.getStatusLine());

         //Retrieving the HttpEntity and displaying the no.of bytes read
         HttpEntity entity = httpresponse.getEntity();
         if (entity != null) {
            System.out.println("Bytes read by thread thread "+id+":
               "+EntityUtils.toByteArray(entity).length);
         }
      }catch(Exception e) {
         System.out.println(e.getMessage());
      }
   }
      
   public static void main(String[] args) throws Exception {

      //Creating the Client Connection Pool Manager by instantiating the PoolingHttpClientConnectionManager class.
      PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager();

      //Set the maximum number of connections in the pool
      connManager.setMaxTotal(100);

      //Create a ClientBuilder Object by setting the connection manager
      HttpClientBuilder clientbuilder = HttpClients.custom().setConnectionManager(connManager);
 
      //Build the CloseableHttpClient object using the build() method.
      CloseableHttpClient httpclient = clientbuilder.build();

      //Creating the HttpGet requests
      HttpGet httpget1 = new HttpGet("http://www.tutorialspoint.com/");
      HttpGet httpget2 = new HttpGet("http://www.google.com/");
      HttpGet httpget3 = new HttpGet("https://www.qries.com/");
      HttpGet httpget4 = new HttpGet("https://in.yahoo.com/");
 
      //Creating the Thread objects
      ClientMultiThreaded thread1 = new ClientMultiThreaded(httpclient,httpget1, 1);
      ClientMultiThreaded thread2 = new ClientMultiThreaded(httpclient,httpget2, 2);
      ClientMultiThreaded thread3 = new ClientMultiThreaded(httpclient,httpget3, 3);
      ClientMultiThreaded thread4 = new ClientMultiThreaded(httpclient,httpget4, 4);

      //Starting all the threads
      thread1.start();
      thread2.start();
      thread3.start();
      thread4.start();

      //Joining all the threads
      thread1.join();
      thread2.join();
      thread3.join();
      thread4.join();
   }
}

Выход

При выполнении вышеупомянутая программа генерирует следующий вывод —