Клиентские запросы Java NIO Http с пулами потоков

Исполнитель пула потоков использует количество потоков для будущей задачи. Он назначает по крайней мере один поток до тех пор, пока run() или call() не вернутся.

Итак, я не понимаю, как использовать пул потоков для HTTP-запросов JAVA NIO.

1) Какой поток будет запускать цикл событий

2) Поскольку потоки не будут блокироваться при вводе-выводе, они выйдут из метода запуска/вызова. Тогда кто позаботится о вызове их обработчиков.

Мой вопрос заключается в том, как использовать клиентские запросы HTTP POST на основе Java NIO с пулами потоков (из-за большого количества HTTP-запросов, которые нам нужно сделать), или с Java NIO действительно не нужно запускать их в нескольких потоках, поскольку поток никогда не будет спать (он всегда выполняется, так как нечего блокировать)


person coder000001    schedule 16.05.2013    source источник


Ответы (1)


Ладно, это философия. Многопоточность может использоваться в двух вариантах (может быть и больше, но в данном случае это несущественно). Традиционная многопоточность использует потоки и блокировку ввода-вывода. Многопоточность с разделением задач (пожалуйста, предложите лучший термин) построена на традиционной многопоточности и использует следующие ограничения:

  • задача типа Runnable является единицей работы;
  • задача может не блокироваться;
  • если задача хочет дождаться длительного события (например, завершения ввода-вывода или временного интервала), она подготавливает другую задачу и организует ее запуск после события и завершает работу (возврат из Runnable.run()).

Задачи отправляются на выполнение в пул потоков.

Асинхронный ввод-вывод идеально вписывается в модель, ориентированную на задачи. Фьючерсы являются связующим звеном между стилями программирования, ориентированными на потоки и задачи. Их можно использовать для передачи информации от задач к потокам, но не в обратном направлении, поскольку задачи могут не блокироваться. Поэтому вам вообще не нужно использовать Futures при разработке полностью асинхронного сервера.

NIO1 требует потока селектора. Создайте и запустите его отдельно от пула потоков. NIO2 (java7) не требует селекторного потока (он поддерживает его в фоновом режиме, чтобы пользователь не беспокоился).

Легко найти примеры серверов NIO. df4j содержит примеры эхо-серверов (но не http-серверов) как для NIO1, так и для NIO2.

person Alexei Kaigorodov    schedule 16.05.2013
comment
Я не могу найти использование пула потоков на github.com/rfqu/ df4j/tree/master/df4j-nio2/src Это действительно поможет, если вы также можете привести несколько конкретных примеров. - person coder000001; 16.05.2013
comment
df4j-nio2 не является отдельным проектом. Посмотрите на df4j-nio, который является базовым, и df4j-nio2 или df4j-nio1 следует добавить в путь к классам в зависимости от того, какую реализацию вы хотите использовать. Threadpool не используется напрямую в df4j, он создается автоматически при необходимости и сохраняется как локальная переменная потока. Доступ к нему можно получить через com.github.rfqu.df4j.core.DFContext.getCurrentExecutorService(). Прочтите Readme.md на странице github.com/rfqu/df4j. - person Alexei Kaigorodov; 16.05.2013
comment
Спасибо :) Если больше нет ответов, это можно пометить как ответ. - person coder000001; 16.05.2013