2013-05-16 4 views
0

Пул потоков Исполнитель использует количество потоков для Future Task. Он назначает хотя бы один поток, пока не будут возвращены функции run() или call().Запросы клиентов Java NIO Http с пулами потоков

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

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

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

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

ответ

2

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

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

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

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

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

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

+0

Я не могу найти использование пула потоков на https://github.com/rfqu/df4j/tree/master/df4j-nio2/src Это действительно помогает, если вы можете привести некоторые конкретные примеры. – coder000001

+1

df4j-nio2 не является отдельным проектом. Посмотрите на df4j-nio, который является базой, а df4j-nio2 или df4j-nio1 следует добавить в classpath в зависимости от того, какую реализацию вы хотите использовать. Threadpool не используется непосредственно в df4j, он создается автоматически при необходимости и сохраняется как локальная переменная потока. Доступ к нему можно получить через com.github.rfqu.df4j.core.DFContext.getCurrentExecutorService(). Прочтите Readme.md at https://github.com/rfqu/df4j –

+0

Спасибо :) Если ответов больше нет, это может быть отмечено как ответ. – coder000001

Смежные вопросы