2016-08-18 3 views
0

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

С моей точки зрения, гарантируется, что каждый запрос обрабатывается одним потоком, из пула потоков обработки запросов (проигнорируем ситуацию, когда код обработки запроса приложения выполняет асинхронную работу).

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

Другими словами, возможно ли, что работа запроса R1, которая выполняется в потоке T1, предварительно упущена, и что поток T1 затем используется для обработки запроса R2, после чего обработка R1 продолжается по T1?

Возможно, этот вопрос может быть более обобщается: Может выполнение исполняемой R1 на нить T1 быть «упреждающий» в пользу исполнения другого Runnable R2 на тот же нити T1?

Я не могу избавиться от ощущения ворчания, что я просто не замечаю основополагающих принципов многопоточности на Java, поэтому, пожалуйста, просветите меня!

+1

Нет, это невозможно. Один поток будет работать по одному запросу, пока это не будет выполнено.Нить, которая работает, никогда не может быть приостановлена, а затем задана другая задача. – f1sh

ответ

4

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

Но это процессор. Нити не переключаются между единицами работы, потому что это была работа процессора.

Конечно, с асинхронными сервлетами это не совсем так. Идея заключается в том, что запрос, который выполняет длительную операцию ожидания (запрос на сторонний сервер и т. Д.), Может освобождать поток обслуживания, пока он ждет ответа, поэтому можно обрабатывать новый запрос клиента. Однако это не «регулярная» операция потока и обрабатывается сервером приложений.

+0

Спасибо за ответ. У моего исходного сообщения/заголовка было 2 вопроса, с противоположными ответами «да/нет» (исправлено это сейчас). Я предполагаю, что вы ответили «нет» на вопрос «Может ли выполнение Runnable R1 в потоке T1 быть« предварительно упущено »в пользу выполнения другого Runnable R2 в том же потоке T1?», Правильно? – Ward

+0

@ Ward Это правильно. «Runnable» останется с «Thread», если бы это было неверно, это вызвало бы много странности, например, с помощью ThreadLocal. – Kayaman

+0

Хорошо, я вижу, что Runnable останется с его нитью. Но мой вопрос несколько отличается: будет ли эта нить T1 недоступна для других runnables R2, R3, если R1 еще не закончен? Другими словами, это поток, связанный с одной исполняемой версией до тех пор, пока эта runnable не завершится? – Ward

0

Короче говоря, ответ отрицательный.

Подробнее: Когда вы говорите, что поток работает с «runnable», я думаю, вы имеете в виду процессор (CPU), управляющий потоком. Поток в java является представителем выполняемой работы, и процессор является фактическим исполнителем. Многопоточное выполнение может произойти в одноядерном ЦП, где процессор переключается между несколькими потоками (где каждый поток уже имеет свою работу уже определен) очень быстро, чтобы создать иллюзию одновременного выполнения, но это действительно по одному.

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

0

Я согласен; короткий ответ - нет.

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

Итак, в то время как R1 на T1 не будет прерван, но будет завершен; конечно, после этого T1 будет запускать несколько T2; и так далее.

+0

Спасибо за ответ. В самом деле, я, конечно, вижу, что T1 позже будет использоваться для обработки некоторых R2, R3 ... Но моя главная проблема заключалась в том, что возможно, что T1 уже повторно используется до завершения R1 ... что не является случай, согласно вашему ответу ... – Ward

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