4

リクエストごとに、多くの計算が行われます。平均して、返信の処理には約 10 分かかります。それまでの間、ユーザーが新しいリクエストを送信した場合。前の要求を続行する意味はまったくありません。

そのため、基本的に実行中の前のスレッドを中断するコードを作成しました。Tomcat環境での良い習慣ですか? それに対処するためのより良い解決策はありますか。tomcat スレッドを中断しても問題ありませんか。または、自分のスレッドプールを管理し、プールに計算を任せるべきですか?


詳細情報: 基本的に、タスク全体が FutureTask でラップされます。すべてのリクエストに対して、このタスクが実行され、タスクへの参照が ConcurrentHashMap によって保存されます。リクエストごとに、マップ内のすべての未来が「キャンセル」され、最新のリクエストの実行に進みます。したがって、以前の要求をキャンセルします。

4

2 に答える 2

2

Q>基本的に前のスレッドを実行しているスレッドを中断します。Tomcat環境での良い習慣ですか?
A> HTTP スレッドが 10 分間ブロックされても問題ないと思います。これは、他のユーザーが HTTP 要求を処理できないことを意味します。それ以外の場合は、独自のスレッド プールを作成して管理してください。

Q> Tomcat 環境で良い方法ですか?
A>Runnable s またはs を中断Callableするのは難しい場合があります。たとえば、スレッドが I/O 操作の途中にある場合、中断するとデータが破損した状態のままになる可能性があります。それ以外は、これはごく普通のやり方です。また、サーバーの容量を予測可能にするために、独自のスレッド プールを使用することをお勧めします。

大きなタスクを多くの小さなタスクに分割できますか? 条件付きに固執して早期に終了することは、中断の良い代替手段になる可能性があります。

または、最初のタスクが操作を終了し、他のタスクが同じ値を返すのを待機/保証することは、環境で意味がありますか? もしそうなら、私はむしろあなたのアプローチの代わりにそれを好む. LoadingCacheまさにそれを行うグアバライブラリからのものがあります。

于 2012-10-18T12:41:31.203 に答える
0

私はあなたの質問を完全に理解しているかどうかわかりません...

ただし、Tomcatアプリケーション内でスレッドプールを実行し、その将来のタスクをキャンセルすることについて話している場合は、問題はありません。

個人的に(サーブレットクラス内などで)割り込みを処理するコードを記述しない限り、Tomcatによって割り当てられたスレッドに割り込みをかけることはありません。

于 2012-10-18T09:27:38.467 に答える