• ベストアンサー

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)みたいなら分かりいいんですが。

質問者が選んだベストアンサー

  • ベストアンサー
  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.2

最初の回答にもあるように、anObject.wait()はanObject.notify()で目を覚ます。 標準的な使い方は: public class SomeData{  synchronized void get(){   if(空){    wait();   }   //データ取得処理  }  synchronized void put(){   //データ収納処理   notify();  } } これで、複数のスレッドが同じSomeDataオブジェクトにアクセスする場合を調停する。

utukusi
質問者

お礼

標準使用方法を教えていただいて、ありがとうございます。 無事に動きました。

その他の回答 (1)

  • kozikoji
  • ベストアンサー率29% (5/17)
回答No.1

まず、waitしているBスレッドは、どのオブジェクト(インスタンス)のモニターで待機しているでしょうか? Cスレッドからnotify()を呼び出す場合、Bスレッドが待機しているのと同じオブジェクト(インスタンス)のnotify()を呼び出さねばなりません。 分かりにくくて、すみません。 ソースをそのまま全て載せていただければ、何かアドバイスできると思います。

utukusi
質問者

お礼

ありがとうございます。 意味が分かりました。例えばLockオブジェクトを作って、 BでLockオブジェクトのwait()を呼び出して、CでLockオブジェクトnotify()を使うことで、動かすことが出来ました。

関連するQ&A

専門家に質問してみよう