みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

投稿日時 - 2008-12-09 19:11:05

QNo.4542536

すぐに回答ほしいです

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

最初の回答にもあるように、anObject.wait()はanObject.notify()で目を覚ます。

標準的な使い方は:
public class SomeData{

 synchronized void get(){
  if(空){
   wait();
  }
  //データ取得処理
 }

 synchronized void put(){
  //データ収納処理
  notify();
 }
}
これで、複数のスレッドが同じSomeDataオブジェクトにアクセスする場合を調停する。

投稿日時 - 2008-12-10 09:56:15

お礼

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

投稿日時 - 2008-12-12 17:07:52

ANo.2

このQ&Aは役に立ちましたか?

5人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

まず、waitしているBスレッドは、どのオブジェクト(インスタンス)のモニターで待機しているでしょうか?

Cスレッドからnotify()を呼び出す場合、Bスレッドが待機しているのと同じオブジェクト(インスタンス)のnotify()を呼び出さねばなりません。
分かりにくくて、すみません。

ソースをそのまま全て載せていただければ、何かアドバイスできると思います。

投稿日時 - 2008-12-09 22:00:46

お礼

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

投稿日時 - 2008-12-12 17:06:37

あなたにオススメの質問