Потоки, генерируемые в Tomcat
У меня есть основной вопрос по созданию потока Tomcat. Выполняется ли каждый экземпляр браузера в одном потоке или он порождает несколько потоков для обработки одного запроса экземпляра браузера?
Я беру ссылку на текущий поток в коде и вызываю метод activecount, и он показывает 20, который указывает на 20 активных потоков. Так что у меня есть сомнения, откуда это значение настроено. Есть ли какой-либо параметр для установки активных потоков на
while (iter.hasNext()) {
GrammarSection agrammarSection= null;
try {
agrammarSection = (GrammarSection) iter.next();
} catch (Exception e) {
System.out.println("DDD if it come in exception "+Thread.currentThread());
System.out.println("DDD if it come in exception "+Thread.activeCount()); //IT PRINTS 20
4 ответов:
Tomcat (и большинство контейнеров сервлетов) используют пулы потоков. То есть они предварительно инициализируют настраиваемое число потоков, и всякий раз, когда запрос поступает на сервер, Поток берется из пула и назначается для обработки запроса.
Tomcat использует пул потоков, смотрите эту ссылку для краткого обзора конфигурации:
Поведение Соединителя Tomcat По Умолчанию
В ответ на вопрос "выполняется ли каждый экземпляр браузера в одном потоке?"ответ "зависит":
Один HTTP-запрос, который возвращает текст и т. д. потребит один акцепторный поток.
Однако, если ваша визуализированная страница также содержит изображения (на том же экземпляре сервера) или если она использует фреймы, то браузер также будет запрашивать их (потому что каждое изображение / страница потребует другого HTTP-запроса к серверу).
И... вышесказанное относится к потокам соединителя HTTP. Вы можете, конечно, иметь сервлет, который является многопоточным (для выполнения какой-либо произвольной задачи). Это не будет считаться с ограничением "maxThreads", замеченным в конфигурации выше, но будет отображаться как активные потоки в JVM.
Вообще это действительно не так.
Многие в обсуждении здесь говорили, что 1 HTTP-запрос будет обслуживаться 1 потоком Tomcat. Но вы не должны думать, что 1 страница вызовет только 1 HTTP-запрос.
По крайней мере, это зависит от того, какой браузер вы используете, сколько ресурсов на 1 странице и задействован ли AJAX, поддерживайте живые соединения.
(1) один экземпляр браузера породит несколько потоков на стороне браузера / клиента для загрузки ресурсов для одной страницы, и будет занимать несколько потоков на Tomcat / Apache/Weblogic / Websphere / независимо от того, какие приложения вы используете. Это связано с характером современного многопоточного браузера. Если вы действительно говорите о простой HTML-странице, она может породить только 1 (рабочий) поток в Tomcat, но когда вы добавляете другие ресурсы на странице, такие как изображения, изображения могут быть (и скорее всего) загружены вместе со страницей. Браузер обычно не ждет, пока вся страница загрузится, прежде чем загружать изображения. Вы можете видеть это ясно, когда вы используете такие инструменты, как FireBug (в разделе Net). Страницы не загружаются последовательно.
(2)в приложении AJAX одна страница также запускает несколько потоков на серверах.
(3) Примите также во внимание, что протокол HTTP 1.1 (если вы все еще не используете HTTP 1.0) будет удерживать соединение до истечения времени ожидания HTTP. По умолчанию соединение не будет закрыто. Вам нужно посмотреть на параметр Keep-Alive в настройках Tomcat / WAR. Возможно, Вам потребуется добавить обратный прокси-сервер (например, Apache, nginx, Squid, лак)перед Tomcat, чтобы разгрузить некоторые из этих сохраненных соединений.
Comments