Jaki jest cel AsyncContext.start (…) w Servlet 3.0?

Servlet API mówi o „AsyncContext.start”:

void start (java.lang.Runnable run)

Powoduje, że kontener wysyła wątek, prawdopodobnie z puli zarządzanych wątków, w celu uruchomienia określonego Runnable. Kontener może propagować odpowiednie informacje kontekstowe do Runnable.

Z tego opisu nie jest jasne, w jaki sposób odnosi się to do zadania optymalizacji wykorzystania wątku, gdy praca wymaga oczekiwania.

W „Servlet & JSP” Budi Kurniawan podaje przykład asynchronicznych funkcji Servlet 3.0, w których używaAsyncContext.start, Pokażę uproszczoną wersję przykładu:

<code>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();
        }
    });
}
</code>

W większości innych przykładów, które spotkałem, metoda serwisowa przechowuje gdzieś AsyncContext i jest przetwarzana gdzie indziej (np. Przez wątek w tle). W tym przykładzie wygląda na to, że zadanie zostało przekazane do innego wątku, który kończy żądanie. Jak rozumiem, teraz jest to po prostu wątek roboczy, który marnuje czas na czekanie.

Czy rzeczywiście zyskujesz coś, przekazując zadanie (które wymaga oczekiwania) z jednego wątku do drugiego? Jeśli nie, to jaki jest celAsyncContext.start(...)?

questionAnswers(4)

yourAnswerToTheQuestion