• 締切済み

Threadのinterruptメソッドについて

javaの勉強をしているんですが、Threadのinterruptメソッドの説明が「そのスレッドがwaitで待機している場合は、それを再開してwaitにInterrupException をスローさせる」と説明が書いてあるのですが、意味が理解できません。 スローさせるスレッドは待機状態であったスレッドを指し例外がスローされて、catch文に処理が移るのでしょうか? 初心者なので分かりやすく説明をお願い致します。

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

みんなの回答

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

>スローさせるスレッドは待機状態であったスレッドを指し例外がスローされて、catch文に処理が移るのでしょうか? その通りです。 waitメソッドでInterrupException例外が起こるということですね。

関連するQ&A

  • wait中にinterruptを呼ばれたスレッドの振る舞いについて

    はじめまして。javaの初心者です。 どうしてもわからないことがあります。 例えば、以下のコードで、 class Foo { public synchronized void foo() { while(条件) { try { this.wait(); } catch(InterruptedException ex)    {     処理    } } } } wait中であったスレッドは、他のスレッドによって interrupt()メソッドを実行されたときは、Fooの ロックを取得してからcatch節を実行すると思うのですが、もし、以下のコードの場合は、 class Foo { public synchronized void foo() throws InterruptedException { while(条件) { this.wait(); } } } wait中であったスレッドは、他のスレッドによって interrupt()を実行されたときにすぐにInterrupted Exceptionをスローするのか、それとも Fooクラスのロックを取得してからInterruptedExceptionをスローするのかどちらなのか がわかりません。どうか教えてください。よろしく お願いします。

    • ベストアンサー
    • Java
  • Javaスレッドの割り込みについて

    Javaのスレッド割り込み制御についてご質問です。 スレッドの割り込みの際に用いるメソッドinterrupt()は、 通常、対象のスレッドがsleep()やwait()状態の最中でアクセス不能な場合に使用しますが、 対象のスレッドが、sleep()やwait()以外の状態で、正常に動作している場合に interrupt()を実行した場合、どのような動きをするのでしょうか? 特に問題などありますでしょうか? お手数ですが、どなたかご教授願います。

  • javaのwaitしてるスレッドをnotifyで起こすことが出来ない

    JDK1.5 WindowsXPです。 現在マルチスレッドを試しています。 A、B、C三つのスレッドがあります。 AはBというスレッドを作るメインスレッドです。 Bは、waitするスレッドです。 public final void run(){  while (true){   try {    //notifyが来るまで待機    waitForNotify();    //実際の処理    act();    //スレッド停止させるための割り込み例外   } catch (InterruptedException e) {    Thread.currentThread().interrupt();    e.printStackTrace();   }   //割り込み受信の場合強制終了する   if (Thread.currentThread().isInterrupted()) {    break;   }  } } こんな感じです。 そしてCのスレッドがnotify()を実行します。 しかしnotify()を実行してもスレッドは起きません。 Bに、 public synchronized void notifyM() throws InterruptedException{   wait(); } のようなメソッドを追加して、スレッドのインスタンスメソッドとして実行しても起きません。 notify()がJavaDOCなどを読んでも意味不明なため、 どのような使い方なら動くのか見当がつきませんので質問しました。 notify(スレッドB)みたいなら分かりいいんですが。

    • ベストアンサー
    • Java
  • wait()したスレッドが起こされるタイミング

    以下のコードにおいて。 % java ThreadWaitTest 2 の場合はaと表示したまま止まりますが、 % java ThreadWaitTest 1 の場合はスレッドの終了に伴ってwait()が切れ、bまで表示します。 私の望む動作は前者です。 後者の場合、これはつまりスレッドをwaitした際の待機プールがスレッドオブジェクトの場合、そのスレッドの実行が終了すると待機プールにある待機スレッドを自動でnotify()してしまうことを意味していると思うのですが、この解釈はあっていますか? Java のAPIドキュメントに 「別のスレッドが notify メソッドまたは notifyAll メソッドを呼び出してこのオブジェクトのモニター上で待機するスレッドに通知を出すまで待機します」 とあるように、ユーザが明確的にnotifyしないと起こらないと思いこんでいました。 なぜこういう仕様になっているのでしょうか? また、この仕様について詳しく書いてあるサイトやドキュメントなどありませんでしょうか? public class ThreadWaitTest extends Thread {  public Object mutex = new Object();    public static void main(String[] args) {   try {    ThreadWaitTest test = new ThreadWaitTest();    test.start();    System.out.println("a");    switch (new Integer(args[0])) {    case 1:     synchronized(test) {      test.wait();     }     break;    case 2:     synchronized(test.mutex) {       test.mutex.wait();     }     break;    }    System.out.println("b");   } catch (InterruptedException ie) {    ie.printStackTrace();   }  }  public void run() {   try {    Thread.sleep(5000);   } catch (InterruptedException ie){    ie.printStackTrace();}   } }

    • ベストアンサー
    • Java
  • mainメソッドのthrows節で設定した例外はどこでcatchされる

    mainメソッドのthrows節で設定した例外はどこでcatchされる? java初心者です。 例えば、mainメソッドの中でAというメソッドが呼ばれるとします。 そのAについての宣言文(定義文)にthrows節が書かれているような場合、 mainメソッド内で、Aを呼び出す際、Aの実行の中で、もし例外が発生した場合には、 mainでその例外をキャッチして処理するよう、mainの記述を行う必要があるかと思います。 では、mainメソッド自体に設定したthrows節(つまり、 public static void main(String[] args) throws TestException{ ~略~ } という宣言) については、 その例外(ここでは、TestException)は、どこでcatchすることになるのでしょうか? もしや、「投げっぱなし」ということなのでしょうか? mainメソッド自体は、基本的に他のメソッドから呼ばれるものではないかと思うので、 mainメソッドでスローした例外の受け取り場所がわからなくて質問させていただきました。 色々調べたつもりなのですが、よくわからなくて困ってしまいました。 あまりに初歩すぎて、どこにも書かれていないのかなんなのか、 その説明が見当たらないこと自体にも、疑問を感じている次第です。苦笑 以上、どなたか、宜しくお願い致します。

    • ベストアンサー
    • Java
  • スレッドの待機と再開

    お世話になります。 マルチスレッドのプログラムで悩んでいます。 public class ThreadLocker {  private static boolean isLocked = false;    public static void lock() {   isLocked = true;   while(isLocked) { ; }  }    public static void unlock() {   isLocked = false;  } } まず、このようなクラスを定義しました。そして複数のスレッドが ThreadLocker.lock(); を呼び出して、処理の進行をストップしている状態があるとします。この状態に対して、とある別のスレッドが ThreadLocker.unlock(); を呼び出すと、それまで無限ループしていたスレッドが解放されて処理を始める、という感じです。 この方法を試してみましたが、無限ループで何も処理をしていないとは言え、リソースを食いまくっているようで、マシンが重くなってしまいました。 そこで、スレッドの待機・再開を行う事ができる wait / notify(All?) メソッドを使用すれば良いのではないかと考えたのですが、具体的な方法が分からず、質問させていただきました。 具体的に、どのインスタンスの wait 及び notify(All?) を呼び出せば良いのかが分かりません。 APIリファレンスの「現在のスレッドはこのオブジェクトのモニターのオーナでなければなりません。」の意味もよく分かりません。 ちなみに、待機しているスレッドは複数あり、class Lock の method execute 中で ThreadLocker.lock() しているとします。 また、再開を促すスレッドは1つで、class Unlock の method execute 中で ThreadLocker.unlock() を呼び出すものとします。 そして、それぞれのスレッドは、お互いのインスタンスを知りません。(説明しづらいので、補足要求があれば、ソースで示します。) よろしくお願いいたします。

    • ベストアンサー
    • Java
  • メソッドの処理の同期化

    いつもお世話になっています。 メソッド処理の同期化についてなのですが、 いろいろ調べてみたのですが、いまいちうまく実行できません。 ソースを考えてみたのですが、どこがどう悪いのかご指摘お願いできますでしょうか? 以下のクラスがある場合で public void Add(){ synchronized(this){ System.out.println("待機しています!"); //おそらくここら辺にwait()/notify()処理が来るきがする //同期中に行わない処理をここに記載する? } System.out.println("Addメソッド実行しました"): } public void Change(){ synchronized(this) { //おそらくここら辺にwait()/notify()処理が来るきがする //同期中に行わない処理をここに記載する? //一時停止 処理時間をずらすためループを使用 try { for(int a=0;a<3;a++){ System.out.println("a="+a); Thread.sleep(10000); } }catch (InterruptedException e) { } System.out.println("Changeメソッド完了です"); } } このとき、Add対Change/Add対Addといった形で同期化処理をしたいのですが、どうしてもうまくできません。 仮にThreadを使用して実行してみようとしたのですが、 順番に実行されてしまいます。 したいのが、 1.Addメソッド実行 2・Addメソッド実行 この場合、現状だと a=0 a=0 a=1 a=1 a=2 a=2  と表示されてしまうので、 a=0 a=1 a=2 a=0 a=1 a=2  と表示することはできるのでしょうか? 原因として、wait()/notify()が記載されていないことが影響していると思うのですが。 宜しくお願いします。

  • ~クラスのメソッドと言った場合継承したものを含むか

    お世話になります。 OJC-Pの勉強中、以下の模試問題が出題されました。 ------------------- Threadクラスのメソッドとして正しいものを全て選びなさい wait() notify() run() start() ------------------- 解答はrun()、start()の2つだったのですが、 この場合、Objectクラスから継承したメソッドは Threadクラスのメソッドとは言わないのかを疑問に感じました。 (外部クラスから見た場合、 継承したメソッドもThreadクラスで新しく定義されたメソッドも区別は ないのでは、と考えたためです。) 問題文の表現に不備があるのでしょうか、 それともやはり 「~クラスのメソッド」と言った場合、継承したものは含まないとするのが 一般的な解釈なのでしょうか。 また、後者の場合、それはどうしてなのか理由なども添えていただけると 嬉しいです。 よろしくおねがいいたします。

    • ベストアンサー
    • Java
  • Javaの例外処理の書き方について

    Javaの例外はErrorとRuntimeExceptionは書かなくてもいいが、 Exceptionはtryでcatchする必要があると聞きました。 しかし、java.langのStringを使っても例外処理は書きません。 なぜ、例外を書くやつと書かないやつがあるのですか? たとえば、java.langを使うとしたら、 ClassNotFoundException CloneNotSupportedException Exception の3つをjava.langを使うメソッドのブロックの上にtry文が必要だと思うのですが。

    • ベストアンサー
    • Java
  • Java:スレッドでエラー発生時に処理を終わらせる

    以下の事が出来ずに悩んでいます。 これ参考になるかな? というようなWEBページ等がありましたら、教えていただけると助かります。 ■やりたいこと ・aaa.javaから、「スレッド1」「スレッド2」「スレッド3」の処理を呼び出し、それぞれのスレッドで処理を実行する。 ・全てのスレッド処理が完了したら、次の処理へ進む。 ・「スレッド1、2、3」で、何かしらのエラーが発生した場合は、「aaa.java」の処理を終わらせる。 ■現状 ・aaa.javaから、「スレッド1、2、3」の処理を呼び出し、それぞれ処理を実行させる事は出来た。 ・すべてのスレッドが完了したら次の処理へ進む事は出来た。 ・「スレッド1、2、3」のどこかでエラーが発生した場合でも、処理の完了となり、「次の処理」へ進んでしまう。 もうちょっと細かい事を書くと、各スレッドでは、それぞれデータ作成のSQLを実行する処理をさせているのですが、 そのSQLが何かしらの要因でエラーで戻ってきた場合、次の処理へ進んでしまうとまずいです。 そのため、どこかのスレッドのSQLがエラーになったら、スレッドを呼び出した元の「aaa.java」でエラー・終了。となるようにしたいです。 一応、各スレッドでSQLのエラーとなった場合には「catch」に飛んでる。状態ではあるのですが、aaa.java側に戻って終わらせる事が出来ず。。。 ソースはだいぶ削りましたが、参考に以下記載します。 (削りすぎている可能性もありますが、その際はごめんなさい。) すみませんが、よろしくお願いします。 ---------------------------------------- aaa.java   public void Sql_Exec() throws SQLException, IOException {     /*     ループ条件の取得。(省略)     */     //ループ処理。     for (ループ条件(省略)) {       //スレッドの呼び出し。       //スレッド1       Thread_1 exec_1 = new Thread_1(引数もろもろ);       Thread thr_1 = new Thread(exec_1);       thr_1.start();       //スレッド2       Thread_2 exec_2 = new Thread_2(引数もろもろ);       Thread thr_2 = new Thread(exec_2);       thr_2.start();       //スレッド3       Thread_3 exec_3 = new Thread_3(引数もろもろ);       Thread thr_3 = new Thread(exec_3);       thr_3.start();       try {         //全てのスレッドが終わるまで待つ。         thr_1.join();         thr_2.join();         thr_3.join();       } catch (InterruptedException e) {         //例外処理         e.printStackTrace();       }     }   } ---------------------------------------- スレッド1~3.java public class Thread_1 extends Thread{   public void run(){     /*     ループ条件の取得。(省略)     */          //ループ処理。     for (ループ条件(省略)) {       try (Connection con1 = DB接続。) {         String sql1 = 実行SQL取得;         PreparedStatement pstmt1 = con1.prepareStatement(sql1);         int aaa = pstmt1.executeUpdate();         con1.close();       } catch (SQLException | IOException | JAXBException e) {         e.printStackTrace();         throw new RuntimeException("例外!");       }     }   } } ----------------------------------------

    • ベストアンサー
    • Java

専門家に質問してみよう