2011-07-31 3 views
4

실행 가능한 개체의 경우 Runnable 인터페이스를 구현하거나 Thread 클래스를 확장해야하지만 HttpServlet은 이러한 작업을 수행하지 않습니다.HttpServlet은 실행 가능 또는 확장 스레드를 구현하지 않습니다. 왜 스레드 가능합니까?

HttpServlet은 어떻게 나눌 수 있습니까?

+1

뭔가가 "thread safe"("thread-able"의 meaing이라고 생각합니다)가 스레드의 진입 점을 제공한다는 의미는 아닙니다. –

+2

관련 항목 : http://stackoverflow.com/questions/3106452/java-servlet-instantiation-and-session-variables – BalusC

답변

13

서블릿 자체는 스레드가 아닙니다. 컨테이너는 서블릿 클래스의 인스턴스 하나를 유지 관리하며 각 요청 (스레드)은 동일한 서블릿 객체를 호출합니다. 따라서 서블릿 인스턴스는 여러 스레드에서 공유됩니다. 의사 코드에서이 같이 보일 수 있습니다 :

class ServerThread extends Thread { 

    private javax.servlet.Servlet servlet; 
    private javax.servlet.ServletRequest req; 
    private javax.servlet.ServletResponse res; 

    public ServerThread(javax.servlet.Servlet servlet, /* request and response */) { 
     this.servlet = servlet; 
     this.req = req; 
     this.res = res; 
    } 

    @Override 
    public void run() { 
     this.servlet.service(req, resp); 
    } 

} 

아니 문제는, 실제로는 훨씬, 훨씬, 훨씬 더 복잡 :-) BTW

될 것입니다 : 그것은 당신의 서블릿 클래스는 스레드 일해야하는 이유 안전한!

+0

감사의 말 ... –

+1

또한 서블릿이 싱글 톤 (singleton) 벤더 독립? –

+1

@Chris Boon : 싱글 톤이지만, 컨테이너 제공자 (Tomcat과 같은)가 어떻게 처리하는지 모르겠다. 그들은 어떤 _crazy_ 트릭을 소개했을지도 모른다. 하지만 그렇습니다. 당신은 그것을 싱글 톤으로 다루어야합니다. – home

1

Java의 모든 클래스는 런타임에 명시 적으로 일종의 검사로 금지되지 않는 한 모든 스레드에서 실행될 수 있습니다. HttpServlet의 세부 사항을 모른 채, HttpServlet 스레드로부터 안전하다는 진술을 발견했습니다. 이 경우 클래스의 특정 인스턴스 (또는 클래스의 정적 메서드)를 한 번에 여러 스레드에서 안전하게 사용할 수 있습니다.

또한 Thread이 실행 가능한 이유는 Runnable 인터페이스를 구현하기 때문입니다. 모든 반은 그렇게 할 수 있습니다. Thread의 주목할만한 측면 인 run() 메서드는 Thread 인스턴스가 시작될 때 해당 스레드의 run() 메서드가 별도의 스레드에서 호출된다는 것입니다.

0

무엇이든 스레드 가능합니다. 스프링 빈에 대한 EJB는 스레드 자체가 아니지만 다중 스레드 환경에서 실행되므로 스레드가 가능합니다.

관련 문제