1

環境:

私はたくさんの読書をしましたが、これは半関連性しかありませんでした.

セッション依存のデータを渡しながら、別の Java クラスからメソッドを呼び出すサーブレットがあります。Tomcat サーバー上で実行されています。

次のようになります。

@WebServlet(urlPatterns = {"/MyServlet", "/"})
public class MyServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException{ 
        HttpSession session = request.getSession(true); //Start a session
        String UserID = session.getId();                //Get a unique user ID
        MyClass cls = new MyClass();                    //Initialize my class
        String shortID = cls.newID(UserID);         //Call a method from class
        System.out.println("Your short ID is: " + shortID); //Print the result
    }
}

そして、私が呼び出しているクラスは次のようになります。

public class MyClass {

    public String newID(String UserID){
        String shortID;
            ... //Method for shortening the UserID
            return(shortID);
    }
}

もちろん、この方法では、この単純な例で示されているよりもはるかに多くの処理が必要です。

質問1:

現在、私の現在の理解では、n人のユーザーがMyServletを同時に呼び出すと、Tomcat はdoGetメソッドでn 個のスレッドを作成します。そのため、メソッドnewIDが同期的に呼び出されると、Tomcat はスレッドをキューに入れ、次々と実行できるようにします。これは正しいです?

質問2:

n番目のユーザーがnewIDメソッドがn-1回完了するのを待つ必要があるため、多数のユーザーがいる場合に問題が発生します。これには時間がかかる場合があります。したがって、スループットを向上させるために、 n 個のスレッドを並行して実行するためにnewIDメソッドを非同期で呼び出す必要があります。

どうすればこれを達成できますか?

リフレクションを使用すること、またはnewIDメソッドをRunnable内にラップすることをお勧めしますか?

Tomcat はExecutorServiceを処理しますか、それとも実装する必要がありますか?

どんな助けでも大歓迎です。サンプルコードも役に立ちます!


4

1 に答える 1

1

質問1:

サーブレット コンテナは、リクエストの処理に使用するスレッドのプールを保持します。また、サーブレット クラスの単一のインスタンスも保持します。リクエストが来ると、最終的に対応するdoXXXメソッドにヒットするスレッドの 1 つをディスパッチします。スレッドは実際にはキューに入れられません。それらは並行して動作します。そのため、同時に入ってくるリクエストは並行して処理されます (ある程度、こちらをお読みください.

質問2:

リクエストを処理するために 10 個のスレッドのプールを持つようにサーブレット コンテナーを構成したとします。しかし、ある時点で 15 件のリクエストを受け取ります。はい、5 つのリクエストがキューに入れられ、使用可能なスレッドを待ちます。その場合、Servlet 3.0 非同期サポート ( read1read2 ) を使用して、別のスレッド (コンテナも管理する) でリクエストを処理することができます。処理が完了すると、プール スレッドが再ディスパッチされて、要求の処理が終了します。

スレッドの管理方法については、こちらをお読みください。

于 2013-08-28T13:49:54.907 に答える