실행 가능한 개체의 경우 Runnable
인터페이스를 구현하거나 Thread
클래스를 확장해야하지만 HttpServlet
은 이러한 작업을 수행하지 않습니다.HttpServlet은 실행 가능 또는 확장 스레드를 구현하지 않습니다. 왜 스레드 가능합니까?
HttpServlet
은 어떻게 나눌 수 있습니까?
실행 가능한 개체의 경우 Runnable
인터페이스를 구현하거나 Thread
클래스를 확장해야하지만 HttpServlet
은 이러한 작업을 수행하지 않습니다.HttpServlet은 실행 가능 또는 확장 스레드를 구현하지 않습니다. 왜 스레드 가능합니까?
HttpServlet
은 어떻게 나눌 수 있습니까?
서블릿 자체는 스레드가 아닙니다. 컨테이너는 서블릿 클래스의 인스턴스 하나를 유지 관리하며 각 요청 (스레드)은 동일한 서블릿 객체를 호출합니다. 따라서 서블릿 인스턴스는 여러 스레드에서 공유됩니다. 의사 코드에서이 같이 보일 수 있습니다 :
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
될 것입니다 : 그것은 당신의 서블릿 클래스는 스레드 일해야하는 이유 안전한!
감사의 말 ... –
또한 서블릿이 싱글 톤 (singleton) 벤더 독립? –
@Chris Boon : 싱글 톤이지만, 컨테이너 제공자 (Tomcat과 같은)가 어떻게 처리하는지 모르겠다. 그들은 어떤 _crazy_ 트릭을 소개했을지도 모른다. 하지만 그렇습니다. 당신은 그것을 싱글 톤으로 다루어야합니다. – home
Java의 모든 클래스는 런타임에 명시 적으로 일종의 검사로 금지되지 않는 한 모든 스레드에서 실행될 수 있습니다. HttpServlet
의 세부 사항을 모른 채, HttpServlet
스레드로부터 안전하다는 진술을 발견했습니다. 이 경우 클래스의 특정 인스턴스 (또는 클래스의 정적 메서드)를 한 번에 여러 스레드에서 안전하게 사용할 수 있습니다.
또한 Thread
이 실행 가능한 이유는 Runnable
인터페이스를 구현하기 때문입니다. 모든 반은 그렇게 할 수 있습니다. Thread
의 주목할만한 측면 인 run()
메서드는 Thread
인스턴스가 시작될 때 해당 스레드의 run()
메서드가 별도의 스레드에서 호출된다는 것입니다.
무엇이든 스레드 가능합니다. 스프링 빈에 대한 EJB는 스레드 자체가 아니지만 다중 스레드 환경에서 실행되므로 스레드가 가능합니다.
뭔가가 "thread safe"("thread-able"의 meaing이라고 생각합니다)가 스레드의 진입 점을 제공한다는 의미는 아닙니다. –
관련 항목 : http://stackoverflow.com/questions/3106452/java-servlet-instantiation-and-session-variables – BalusC