API-интерфейс сервлета говорит об "AsyncContext.start":
void start (java.lang.Runnable run)
Заставляет контейнер отправлять поток, возможно из пула управляемых потоков, для запуска указанного Runnable. Контейнер может распространять соответствующую контекстуальную информацию на Runnable.
Из этого описания неясно, как оно относится к задаче оптимизации использования потока, когда задание требует ожидания.
В "Сервлетах и JSP" Budi Kurniawan дает пример асинхронных функций Servlet 3.0, где он использует AsyncContext.start
, я покажу упрощенную версию примера:
public void doGet(...) {
final AsyncContext asyncContext = request.startAsync();
asyncContext.start(new Runnable() {
@ Override
public void run() {
// do some work here which involves waiting
...
asyncContext.complete();
}
});
}
В большинстве других примеров, которые я встречал, метод службы просто хранит AsyncContext где-то и обрабатывается где-то еще (например, фоновым потоком). В этом примере похоже, что задание просто передается другому потоку, который завершает запрос. Как я понимаю, теперь это просто рабочий поток, который тратит время на ожидание.
Вы действительно что-то получаете, передавая работу (которая включает в себя ожидание) из одного потока в другой? Если нет, то какая цель AsyncContext.start(...)
?