仕事の会議中に、新しいアプリケーション サーバーは新しい 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 へ: あなたが公開したのは非同期呼び出しであり、スレッドとは何の関係もありません。