2016-05-04 16 views
0

私は、レスポンスの送信後にバックグラウンドで実行できる長いタスクを起動するJavaサーブレットを持っています。私は、スレッドを起動することが最後のものであるにもかかわらず、ログエントリから通知することができます私はサーブレットでは、フレームワークは新しいスレッドが開始した後も要求関連コードを実行しています。現在のスレッドが終了した後にスレッドを起動する

現在のスレッドを新しいスレッドのコンストラクタ(parentThread)に渡し、その参照を保存し、run()の最初の文としてparentThread.join()を呼び出すことを検討しています。しかし、それはかなりkludgyようです。

もっと優雅なソリューションはありますか?

+0

私は、実際に子スレッドを親スレッドに参加させようとしましたが、結合の直後に設定されたデバッグブレークポイントには到達しませんでした。したがって、Tomcatのスレッド管理は、このスキームが動作しないようにしているようです。 –

答えて

1

通常、スレッドはサーブレットコンテナによってプール/リサイクルされるため、終了を待つ意味はほとんどありません。 現在の要求とは独立して作業を行うことができれば、とにかくスレッドを生成する上で問題はありません。

あなたのエコシステムによっては、Spring Executorサービスや、バックグラウンドタスクのスケジューリングのための@Asynchronous抽象化を調べる必要があります。非同期サーブレットAPIも参照してください。

0

ThreadPoolExecutorクラスを参照して、自分のスレッドをローリングさせるのではなく、ニーズに合ったものかどうかを見てみましょう。私は通常、サーブレットの初期化時にスレッドを開始し、次にdoGet()メソッドとdoPost()メソッドは単にキューにサブミットして戻ります。エグゼキュータは、サーブレットの実行中にバックグラウンドで実行されます。

ThreadPoolExecutor API

文で詳細を有することが有用であろう:「フレームワークは、まだ新しいスレッドが開始された後、要求に関連するコードを実行しています。」

関連する問題