2011-09-17 11 views
37

Czy ktoś może wyjaśnić, co to jest wątek na żądanie i wątek na połączenie? W którym modelu działają serwlety? W jaki sposób przydzielane są wątki do obsługi żądań HTTP? Czy jest to wątek/żądanie lub połączenie?W jaki sposób są przydzielane wątki do obsługi żądania Servlet?

I powiedzmy, jeśli chcę wykonać czasochłonne zadanie w moim Servlet „s doGet() metoda asynchronicznie, zaczynam nowy wątek przy użyciu wykonawców Java, dzięki czemu długie obliczenia wykonywane są w osobnym wątku, a odpowiedź zostanie wysłana od razu.

Czy to oznacza, że ​​zwolniłem wątek, który przetwarzał mój HttpServletRequest, czy nadal jest używany, ponieważ wątek podrzędny wciąż działa?

Odpowiedz

42

Żądanie oznacza, że ​​w przypadku żądania HTTP wątek jest tworzony lub pobierany z puli, aby go wyświetlić. Jeden wątek służy całej prośbie. Wątek na połączenie byłby taki sam, z wyjątkiem tego, że wątek jest używany dla całego połączenia, które może być wielokrotnymi żądaniami, a także może zawierać wiele przerw między żądaniami. Kontenery serwletów są wątkami na żądanie. Mogą istnieć pewne implementacje oferujące wątek na połączenie, ale nie wiem, i wydaje się, że byłoby to bardzo marnotrawstwem.

Utworzenie nici wewnątrz innego wątku nie ustanawia żadnej specjalnej relacji, a cały cel w większości przypadków polega na tym, aby jeden wątek mógł wykonać więcej pracy lub zakończyć pracę, podczas gdy drugi wątek nadal działa. W twoim scenariuszu użycie innego wątku do wykonania pracy wymaganego przez żądanie spowoduje, że, jak można się spodziewać, odpowiedź zostanie wysłana natychmiast. Wątek używany do obsługi tego żądania będzie również natychmiast dostępny dla innego żądania, niezależnie od tego, jak długo zajmuje ukończenie drugiego wątku. Jest to całkiem niezły sposób pracy asynchronicznej w kontenerze serwletu wątek na żądanie.

Zastrzeżenie: Jeśli jesteś w pełnym pojemniku Java EE, nici mogą być prowadzone dla Ciebie w sposób, który sprawia, że ​​to zły pomysł na tarło własną rękę. W takim przypadku lepiej spytać kontener o wątek, ale ogólne zasady są takie same.

+0

To nie jest sposób wykonywania pracy asynchronicznej w kontenerze, może być najprostszy, ale nie jest zalecany. http://stackoverflow.com/questions/533783/why-spawning-threads-in-j2ee-container-is-discouraged/533847#533847 – Robin

+0

@Robin: Dobre połączenie. Dodałem zastrzeżenie dotyczące pełnych kontenerów JEE. Zwykle myślę w kategoriach prostych kontenerów serwletów. –

+0

@Robin: Dzięki chłopaki. Nie zajmuję się samodzielnie cyklem żywotności nici. Planuję użyć Spring TaskExecutor abstraction.http: //static.springsource.org/spring/docs/2.0.x/reference/scheduling.html#scheduling-task-executor-usage Moja aplikacja internetowa pracuje pod tomcat 6. Spring also zapewniają implementację workmanager, jak wspomniano w odnośniku, ale mówi, że nie jest to specyfikacja JEE. Który z nich jest lepszy w moim środowisku? – hellojava

Powiązane problemy