• 締切済み

Servletのスレッドを終了させたい

通常、一つのServletに対して、同一のsession idで(一つのクライアントで)複数並列処理します。 しかし、それじゃ都合が悪いので、一つのServletに対してはsession id毎に一つのスレッドしか発生しないようにしたいと思っています。ただ、あるスレッドが処理している最中にリクエストを受け付けたら、既に動いているスレッドを強制終了させて、後のリクエストのみを処理させたいと思っています。 が、なかなかいい案が思い浮かばず苦悩しています。 要求条件を整理すると次のようになります。 ・一つのServletに対して、一つのsession idで一つのスレッドだけしか処理しないようにしたい。 ・最後に受け付けたリクエストを活かし、処理中のスレッドは終了させたい。 二つ目の条件を満たすためには、一時的に二つのスレッドが発生することになると思っています。 皆様のお知恵をおかしください。

  • Java
  • 回答数1
  • ありがとう数3

みんなの回答

回答No.1

ThreadGroup(スレッドグループ)を使うのはどうでしょうか? 詳細は、ThreadGroupクラスのリファレンスを見てください。 スレッドグループを取得し、現在のアクティブなスレッドを取得もしくは 破棄し、カレントのリクエストをいかす。というような処理をすれば、 この2点は実現できそうな気がします。 ちなみに、 現在のスレッドからスレッドグループを取得する方法は、 ThreadGroup grp = Thread.currentThread().getThreadGroup()で行えます。 あとは、スレッドグループからアクティブなスレッド数や スレッドの参照取得、等いろいろ制御ができるので、 これを応用してこの2点を実現できそうな気がしますが。 アドバイスになりましたでしょうか?

関連するQ&A

  • スレッドについてお教えください。

    スレッドについてお教えください。 今、画面のプログラムより、帳票を出力しています。 帳票の出力に時間がかかるため画面のプログラムとは非同期に 別スレッドにして帳票を出力しようと考えたのですがこの場合 一つの帳票の処理中に同じ要求が複数来た場合、スレッドは 複数立ちあがってしまい帳票の順番が狂ってしまうものと 思います。 これを要求はキューしていくが、処理は順次行う(1処理終了後に 次の要求を処理する)ということは可能なのでしょうか? お願いいたします。

  • Oracleで今接続しているセッションをSQLで知りたい。

    こんにちは Oracleで自分がどのセッションIDで接続しているかを調べる方法を教えてください。 条件:同一端末より複数プロセス(同一EXE)※から別セッションで接続しています。 ※複数スレッドで別セッションで処理が並列で行われる。

  • リクエスト処理スレッド

    アプリケーションサーバーで Webアプリを動かし、 リクエスト処理スレッドが復帰しない場合、 つまり数分間ビジーな場合、エラーが出ることを確認しなければならなくなりました。 単にビジーになればいいのかと、 whileで終了しないループを作ってみたのですが、 それではリクエスト処理スレッドにはならなく、タイムアウトにはなったものの、目的のエラーが出てくれませんでした。 リクエスト処理スレッドがビジーとなるようなプログラムをどう組めばいいか教えてください。 ヒントだけでも助かります

    • ベストアンサー
    • Java
  • 複数のスレッドから1つのスレッドの関数を呼び出す場合、順次呼び出したいのですがどうしたらいいですか?

    スレッドが8個あったとして スレッド1、スレッド2、スレッド3から スレッド5の関数を呼び出したとする。 この場合どうなるか教えてください。 どうなるというのは例として スレッド1 → getHoge() を呼び出した。 スレッド2 → getHoge() を呼び出した。 スレッド3 → getHogeHoge() を呼び出した。 場合、 スレッド2がgetHoge()を呼び出したときに、 スレッド1が呼び出したgetHoge()が終了していないとすると 1.スレッド1の呼び出したgetHoge()が終了後スレッド2が呼び出した getHoge()を実行していくのか? 2.スレッド1の呼び出したgetHoge()とスレッド2の呼び出したgetHoge()が並列処理されるのか? public class TThread extends Thread { (関数は質問趣旨とは関係ないので省略して書く) public int getHoge(); public int getHogeHoge(); }

    • ベストアンサー
    • Java
  • JSP+Servletで終了ボタン

    JSPで、終了ボタンをクリックしたときに、 ブラウザを閉じる、といった処理は <INPUT TYPE = "submit" NAME="EXT" VALUE ="終了" onclick ="window.close();"> などでできるとあったのですが、 終了ボタンで、ページ(JSPではなく、 HTML)を移動する場合、onclick=以下に HTMLのアドレスを書いたらいいのでしょうか? やってはみたのですが、うまくいきませんでした。 うまくいかないというのは、 そのままServletにリクエストがわたるようで、 表示ページから何も移動しないということです。 また、<a href = "・・・></a>という リンクのタグもやってみましたが、 ランタイムエラーがでてしまいました。 何か外しているようでしたら、教えていただきたい のですが。。。。

    • ベストアンサー
    • Java
  • スレッドの安全な終了のさせ方

    スレッドの安全な終了のさせ方  メインスレッドにてCreateThread命令を使い、あるサブスレッドを作りました。 このサブスレッドは内部でmallocを使い動的に配列領域を確保して その配列領域をforループ等で「かなり時間の掛かる処理」として繰り返し アクセスしています。 ループが終了した時に「free」を実行してmalloc領域を開放しています。 アプリ終了時にメインスレッドからこのサブスレッドを終了させるのに メインウインドウにWM_DESTROYメッセージが送られた時、これまで単に そこで「CloseHandle(hSubThread);」とだけ書いていたのですが、 もしかしたらこれでは場合によっては(サブスレッドがループ処理中だったら) malloc領域が開放されずにリークしてしまうのではないかと思いました。  そこでイベントオブジェクトを使い、サブスレッドがループ処理中の 時には非シグナル状態にして、ループが終了しfreeで領域を開放した後 シグナル状態にするということにして、メインスレッドはそれを WaitForSingleObjectで待つという構造にしました。 ところが「メインスレッドに待ちを作るな」という言葉通り、これでは 上手く行きませんでした。サブスレッドはその時間の掛かる処理の 最中でSendMassage等でメインスレッドの処理を促すような命令を (例えばその処理の進捗状況を表示するなど)を幾つも行っていたので、 もしWaitFor~でメインを待たせると「サブスレッドの処理も進まなくなり 結果両方がロックして動かなくなってしまう」という悲しい状況に 嵌ってしまうのです。 SendMessageを徹底的に無くすということも考えたのですが、 (例えばPostMessageに書き換えるなどもやってみたのですが、これは 全く意図した動作をしてくれない場合もあり)、別の方法では どうしても代替できないケースもあって、全て消すというのは 現実的ではないのかもと。。  このようなサブスレッドを安全に終了させるにはどうしたら良いでしょうか? あるいは単にデストロイ時にCloseHandleとするだけでも良いのでしょうか?

  • WEBでServletに値を渡してウィンドウを閉じたいのですが…

    ある子ウィンドウで選択した値をServretに渡してセッションに格納して子ウィンドウを閉じたいのですが、 Servletで処理している最中にウィンドウが閉じてしまい、値を格納できません。 (IOExceptionが出てしまい、セッションに格納できません。) Servletに渡し終えたかの判断ができればいいのですが…何かよい方法はありませんか? 下記にJava Scriptを書いておきます。 function action_submit(){ with(document.form**){ action= "<Servlet>?URLNAME="+URLNAME.value;   method= "POST";   submit(); } window.close(); } Javaでの制御なのかJava Scriptの制御なのかどちらがいいのでしょうか? ご回答よろしくお願いします。

  • セッション無効できない。Servlet/JSP

    失礼します。 JavaでServlet/JSPでWebアプリを作っているのですが、 ログアウト処理(セッションの無効化)で困っています。 sessionを操作するSessionOperatorクラスでログアウト処理を実装しています。 SessionOperator sp = new SessionOperator(request,response); sp.logout(); /* ログアウトメソッド */ public void(){ session.invalidate(); } このようにセッションを無効化にしようとしているのですが、その後アカウントページのURLを直接入力でアクセスするとログインしている状態になってしまいます。 ログアウト後、直接入力でアクセスするとエラー画面を表示させたいです。 セッションはちゃんと無効化するにはどうすれば良いですか? セッションの無効化をSessionOperatorクラスで実行すると無効化できないんでしょうか。 どなたか教えてください。

    • ベストアンサー
    • Java
  • Tomcatのスレッドを破棄する方法

    はじめまして。 使用ツール:Tomcat 6.0 前提条件:Tomcatのserver.xmlでmaxThreads="1"と記述し、同時にスレッドが1つしか動作しないようにしている 質問: ブラウザでDBに登録されている全ての情報を取得し表示する時の動作。 ブラウザ(情報取得ボタン押下) ↓ サーブレット:DB(情報取得) ↓ ブラウザ(結果出力)  DBからの情報取得の処理が多少時間がかかってしまうため、その間にブラウザの中止ボタンが押下されてしまう場合があります。  その場合、ブラウザ⇔HTTPサーバ(Tomcat)でのセッションは切れているのですが、サーブレットの処理は継続して行われています。  再度、情報取得ボタンが押下されると、前提条件でスレッドが1つしか作成しないようにしているため、前の処理が終了するまで待機しするという形になっています。  この場合、中止→取得→中止→取得と何度も繰り返される(IEの場合取得ボタンを連打でも可)と、さらに結果の出力が遅くなるということがおきてしまいます。  これを解決するために、Tomcatが新しいリクエストを受け取った場合、現在のスレッドを破棄するといった形にできればと考えています。  上記の考えで調査を行っているのですが、良い情報を見つけることが出来ません。    実際にTomcatが現在実行中のスレッドを破棄し、新しいリクエストを受付けて処理を実行するといったようなことはできるのでしょうか?  ご存知の方がいらっしゃったら、どうか助言をよろしくお願いいたします。

  • セッションIDの付け替えについて

    はじめまして。 Servlet でセッションIDの付け替えをしたいのですが、 HttpSession session = request.getSession(); out.println(session.getId()); session.invalidate(); HttpSession newSession = request.getSession(true); out.println(newSession.getId()); のように、 一度invalidate()してから、 新しいセッションを取得しても 同じセッションIDとなってしまいます。 違うセッションIDを振るにはどうしたらよいでしょうか。