仕事の会議中に、新しいアプリケーション サーバーは新しい IO と呼ばれる新しいスレッド テクノロジを使用するため、スレッド ローカルは完全にアンチ パターンであると聞いたことがあります。応答を返すことは絶対にリソース (メモリと CPU) の浪費です。新しく開発されたスレッド戦略はスレッドのプールを使用するため、スレッドが不要になるとプールに戻ります。私が聞いたところによると、この新しいテクノロジーは、Jboss、Websphere などの新しい AS に実装されているということです。わからない)。たとえば、Apache tomcat でローカルに使用できますか?(その事実に関するドキュメントが可能な場合)
4 に答える
ThreadLocalはあなたの物語の脇役です。あなたが聞いたことがあるのは、非同期リクエスト処理です。これは、とりわけ NIO ライブラリによって支援されます。
このプログラミング パラダイムでは、次のような単純なメソッドは得られません。
Response processRequest(Request req)
代わりにあなたは得る
void requestReceived(Request req, Response resp)
このメソッド内では、通常、バックエンド リクエストを準備し、次のようなメソッドを呼び出して処理を開始します。
execute(Query q, ResultCallback cb)
フレームワークは、クエリ結果を含むResultCallbackのメソッドを呼び出します。resultReady(Result res)
ここでの主なポイントは、メソッドrequestReceivedがすぐに戻り、バックエンド サブシステムでバックエンド リクエストが処理されている間、スレッドを占有しないことです。
ところで、このスタイルのプログラミングの別の名前は、継続渡しスタイルまたは CPS です。これは、関数を呼び出すときに、その戻り値を待つのではなく、関数の結果で呼び出されるコールバックを関数に渡し、リクエスト処理全体の継続を実装するためです。
ThreadLocal がこれにどのように適合するか
私が上で言ったことに従っているなら、このスタイルのリクエスト処理でThreadLocalは、リクエスト処理がスレッドからスレッドへと自由にジャンプし、完全に外部にある方法で s が役に立たない概念であることはすでに明らかなはずです。あなたのコントロール。
ThreadLocal は基本的に、データベースや ThreadPools/ExecutorServices とは何の関係もありません。ThreadLocal は、そこに格納されている値が、どのように設定されているかによって Thread に表示されることを意味します。これにより、ブロックが発生することはありません。あなたはそこでいくつかのことを混乱させなければなりません。
- ThreadLocal: スレッドごとに変数を格納します。
- 「新しい IO」: おそらくjava.nio パッケージを意味していました。ブロックせずにデータを読み書きすることについてです。
- Threadpools/Executorservice: Runnables を送信できるスレッドの束。ExecutorServicesは標準ライブラリの一部であるため、任意の Java アプリケーションで使用できます。
- データベースにアクセスするには、通常、スレッドとデータベース接続を管理するC3P0などの専用システムを使用します
私は主題を誤解していると思います。さて、私が聞いたことを詳しく説明します。ThreadLocal.If を使用する場合、たとえば、DataBase または JMS 呼び出しへのクエリがある場合。応答が返されるには、スレッドが生きている必要があります (たとえば、15 分かかるとします)。スレッドは、Db が戻るのを待っている待機状態になります。 response.so メモリだけでなく、CPU の無駄です。新しいスレッド管理テクノロジは、スレッドのプールを使用します。実際には、待機時間中です。スレッドは、別のクライアントにサーバーを提供するために使用されます。それは私が聞いたことです。Marko Topolnik へ: あなたが公開したのは非同期呼び出しであり、スレッドとは何の関係もありません。