は、それがRunnable
インタフェースを実装するかThread
クラスを拡張する必要がある、しかし、HttpServlet
は、これらのいずれかを行うことを思えません。HttpServletは、実行可能スレッドまたは拡張スレッドを実装していません。なぜスレッド可能ですか?実行可能するオブジェクトの場合
はどのようにHttpServlet
来るねじ込むことができるか、私が間違っていますか?
は、それがRunnable
インタフェースを実装するかThread
クラスを拡張する必要がある、しかし、HttpServlet
は、これらのいずれかを行うことを思えません。HttpServletは、実行可能スレッドまたは拡張スレッドを実装していません。なぜスレッド可能ですか?実行可能するオブジェクトの場合
はどのようにHttpServlet
来るねじ込むことができるか、私が間違っていますか?
サーブレット自体はスレッドではありません。コンテナはサーブレットクラスの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);
}
}
ない質問は、現実にはそれははるかに、はるかに、はるかに複雑な:-)ところで
次のようになります。それはあなたのサーブレットクラスはスレッドでなければならない理由です安全!
おかげでバディ... –
はまた、あなたはサーブレットがシングルトンである、またはそれがあることを言っている、コンテナベンダー独立? –
@Chris Boon:私はそれがシングルトンだと確信していますが、Tomcatのようなコンテナプロバイダがどのように処理するのかわかりません。彼らはいくつかの_crazy_トリックを導入しているかもしれません。しかし、はい、あなたはシングルトンとして扱うべきです。 – home
実行時に何らかのチェックによって明示的に禁止されている場合を除き、Javaのクラスはどのスレッドでも実行できます。 HttpServlet
の詳細を知らなければ、HttpServlet
のスレッドセーフであるという声明をどこかで遭遇したと思います。この場合、あるクラスのインスタンス(またはクラスの静的メソッド)は、一度に任意の数のスレッドから安全に使用できます。
また、Thread
が実行可能である理由は、Runnable
インターフェイスを実装しているためです。どんなクラスでもそうすることができます。 Thread
のrun()
メソッドの注目すべき点は、Thread
インスタンスが起動されたときに、そのrun()
メソッドが別のスレッドで呼び出されることです。
スレッド可能です。 Spring Bean用のEJBはスレッド自体ではありませんが、マルチスレッド環境で動作するためスレッド可能です。
何か「スレッドセーフ」(「スレッド可能」のmeaingとしています)が、スレッドのエントリポイントを提供するわけではありません。 –
関連:http://stackoverflow.com/questions/3106452/java-servlet-instantiation-and-session-variables – BalusC