0

仕事の会議中に、新しいアプリケーション サーバーは新しい IO と呼ばれる新しいスレッド テクノロジを使用するため、スレッド ローカルは完全にアンチ パターンであると聞いたことがあります。応答を返すことは絶対にリソース (メモリと CPU) の浪費です。新しく開発されたスレッド戦略はスレッドのプールを使用するため、スレッドが不要になるとプールに戻ります。私が聞いたところによると、この新しいテクノロジーは、Jboss、Websphere などの新しい AS に実装されているということです。わからない)。たとえば、Apache tomcat でローカルに使用できますか?(その事実に関するドキュメントが可能な場合)

4

4 に答える 4

6

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 が役に立たない概念であることはすでに明らかなはずです。あなたのコントロール。

于 2013-07-24T11:18:54.503 に答える
1

ThreadLocal は基本的に、データベースや ThreadPools/ExecutorServices とは何の関係もありません。ThreadLocal は、そこに格納されている値が、どのように設定されているかによって Thread に表示されることを意味します。これにより、ブロックが発生することはありません。あなたはそこでいくつかのことを混乱させなければなりません。

  • ThreadLocal: スレッドごとに変数を格納します。
  • 「新しい IO」: おそらくjava.nio パッケージを意味していました。ブロックせずにデータを読み書きすることについてです。
  • Threadpools/Executorservice: Runnables を送信できるスレッドの束。ExecutorServicesは標準ライブラリの一部であるため、任意の Java アプリケーションで使用できます。
  • データベースにアクセスするには、通常、スレッドとデータベース接続を管理するC3P0などの専用システムを使用します
于 2013-07-24T11:17:31.680 に答える
0

私は主題を誤解していると思います。さて、私が聞いたことを詳しく説明します。ThreadLocal.If を使用する場合、たとえば、DataBase または JMS 呼び出しへのクエリがある場合。応答が返されるには、スレッドが生きている必要があります (たとえば、15 分かかるとします)。スレッドは、Db が戻るのを待っている待機状態になります。 response.so メモリだけでなく、CPU の無駄です。新しいスレッド管理テクノロジは、スレッドのプールを使用します。実際には、待機時間中です。スレッドは、別のクライアントにサーバーを提供するために使用されます。それは私が聞いたことです。Marko Topolnik へ: あなたが公開したのは非同期呼び出しであり、スレッドとは何の関係もありません。

于 2013-07-24T11:26:32.503 に答える