tomcat線程池與servlet
①客戶端向服務器端發出請求;
②這個過程比較重要,這時候Tomcat會創建兩個對象:HttpServletResponse和HttpServletRequest。并將它們的引用(注意:是引用!)傳給剛分配的線程中;
③線程開始著手接洽servlet;
④servlet根據傳來的是GET和POST,分別調用doGet()和doPost()方法進行處理;
⑤和⑥servlet將處理后的結果通過線程傳回Tomcat,并在之后將這個線程銷毀或者送還線程池;
⑦Tomcat將處理后的結果變成一個HTTP響應發送回客戶端,這樣,客戶端就可以接受到處理后的結果了。
在服務器里,有一個servlet,當客戶端第一次訪問服務器時,tomcat會 幫我們建一個servlet的對象出來,(注意: tomcat里面可能部署了10個Servlet,如果某一個Servlet從未有客戶端調用過,那我們new它的實例,企不是沒有意義,所以new實例 出來,是客戶端第一次訪問的時候。)然后幫忙高用init(ServletConfig)方法,這個方法可以做一些初始化的工作,而且這個方法也只調用一 次,接著以多經程的方式,處理客戶端的請求,例如一個請求過來了,tomcat幫忙調用service()方法,service()方法又調用了受保護的 service()方法,這個受保護的service()方法,又幫忙調用了doGet()或是doPost()方法。
多線程是怎么回事呢?tomcat內部有一個線程池,如果這個servlet的訪 問量很大,一下子有100個人,全部過來了,tomcat 不會幫我們new出100個HelloWorldServlet的對象出來的,自始至終,這個對象只有一個,這個對象會提前準備出若干個線程,但是讓一個 線程跑起來,是有開銷的,有時開銷我們都會感覺出來的,因為線程比較耗時,所以,讓線程提前跑起來,這些跑起來的線程組成一個線程池。
客戶端的請求,比如,第一個請求過來了,tomcat會從線程池,分配一個空閑的線程,處理這個請求,如果同時有第二個客戶端的請求過來了,tomcat從線程池里分配另外一個閑著的線程,處理第二個請求,也就是說,以是這種并發的方式進行處理的,多線程的方式處理的。
每一個線程,都是訪問同一個servlet對象,都是通過這一個對象的引用,調用service()方法。