Каково назначение AsyncContext.start(…) в Servlet 3.0?

Servlet API сообщает об "AsyncContext.start":

void start(java.lang.Runnable run)

Заставляет контейнер отправлять поток, возможно, из управляемого пула потоков, для запуска указанный Runnable. Контейнер может передавать соответствующую контекстную информацию в Runnable.

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

В "Servlet & 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(...)?

19
задан Aivar 9 April 2012 в 12:52
поделиться