2011-07-31 20 views
4

は、それがRunnableインタフェースを実装するかThreadクラスを拡張する必要がある、しかし、HttpServletは、これらのいずれかを行うことを思えません。HttpServletは、実行可能スレッドまたは拡張スレッドを実装していません。なぜスレッド可能ですか?実行可能するオブジェクトの場合

はどのようにHttpServlet来るねじ込むことができるか、私が間違っていますか?

+1

何か「スレッドセーフ」(「スレッド可能」のmeaingとしています)が、スレッドのエントリポイントを提供するわけではありません。 –

+2

関連:http://stackoverflow.com/questions/3106452/java-servlet-instantiation-and-session-variables – BalusC

答えて

13

サーブレット自体はスレッドではありません。コンテナはサーブレットクラスの1つのインスタンスを保持し、各要求(スレッド)は同じサーブレットオブジェクトを呼び出します。したがって、サーブレットインスタンスはスレッド間で共有されます。擬似コードでは、それは次のようになります。

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); 
    } 

} 

ない質問は、現実にはそれははるかに、はるかに、はるかに複雑な:-)ところで

次のようになります。それはあなたのサーブレットクラスはスレッドでなければならない理由です安全!

+0

おかげでバディ... –

+1

はまた、あなたはサーブレットがシングルトンである、またはそれがあることを言っている、コンテナベンダー独立? –

+1

@Chris Boon:私はそれがシングルトンだと確信していますが、Tomcatのようなコンテナプロバイダがどのように処理するのかわかりません。彼らはいくつかの_crazy_トリックを導入しているかもしれません。しかし、はい、あなたはシングルトンとして扱うべきです。 – home

1

実行時に何らかのチェックによって明示的に禁止されている場合を除き、Javaのクラスはどのスレッドでも実行できます。 HttpServletの詳細を知らなければ、HttpServletのスレッドセーフであるという声明をどこかで遭遇したと思います。この場合、あるクラスのインスタンス(またはクラスの静的メソッド)は、一度に任意の数のスレッドから安全に使用できます。

また、Threadが実行可能である理由は、Runnableインターフェイスを実装しているためです。どんなクラスでもそうすることができます。 Threadrun()メソッドの注目すべき点は、Threadインスタンスが起動されたときに、そのrun()メソッドが別のスレッドで呼び出されることです。

0

スレッド可能です。 Spring Bean用のEJBはスレッド自体ではありませんが、マルチスレッド環境で動作するためスレッド可能です。

関連する問題