2012-08-24 5 views
6

ユーザがcommandlinkをクリックすると、ポップアップが生成されます。このクリックは、処理するIDを渡します。ビュースコープ付きBeanでスレッドを終了するにはどうすればよいですか?

私のマネージドBeanはビュースコープであり、いくつかのタスクを実行するスレッドを作成しています。

ユーザがリンクをクリックすると、ポップアップが生成され、スレッドがジョブの実行を開始したとします。たとえば、ユーザがポップアップを閉じて今度は別のIDを提供するリンクをクリックしようとします。私の問題は、開始された前のスレッドが破棄されていないことです。私はまだ応答として最新のIDの詳細を取得することができますが、前のスレッドはまだジョブを実行します。

新しいリクエストで以前のインスタンススレッドを終了する方法があるかどうかを知りたいと思います。私はsessionscopedを使用してこれを達成できますが、ポップアップは同じセッションで開かれています。

+0

いずれかの男??? – PermGenError

答えて

1

ちょうどあなたのユースケースのための可能な迅速な解決策として:(スレッドプーリングアイデアは標準APIで提供されるより効率的な+のように)

  • 私は
  • ではなく、要求ごとに新しいスレッドを作成するよりも、スレッドプールを使用したいですあなたは簡単にプール、私が上で見つけた溶液中の任意の実行中のスレッドを停止することができます:http://www.coderanch.com/t/234197/threads/java/stopping-runnable-ThreadPoolExecutor =>質問は、スレッドプールの実装のためのサンプルが含まれており、1.stの答えは呼び出しあなたのソリューション

を与える:

boolean cancel(boolean mayInterruptIfRunning) 

コールが使用する必要がありますあなたのケースでは:

mayInterruptIfRunning=true 

残された唯一のquesionは次のとおりです。将来の参照を維持するためにはどこ? :)
あなたも同様にしたい場合はそれについて話すことができます:)

+0

b ..お返事いただきありがとうございます。ほんとうにありがとう。私はそれがトリックをしたと思う。私は静的なブール変数を使用しました。スレッドプールが最初に実行されるときにtrueに設定されます。したがって、2番目のリクエストでは、現在のスレッドプールをキャンセルして新しいインスタンスを作成します。これを行う標準的な方法であればわからない。私は質問のコードを編集しました。あなたが言うこと ? – PermGenError

+1

これは1つのクライアントに対してのみ有効です(静的フィールド-ifinterruptを使用する場合)。あなたが2つのクライアントを持っている場合は、別の1つのスレッドを終了することができます。私はそれが望ましい動作ではないと思う:)むしろあなたはマッピングを提供する必要があります:<セッション識別子>将来の –

+0

ああ、私は完全に忘れてしまった...ちょうど明確にするために、 .. – PermGenError

関連する問題