アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (2件)

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



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

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

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

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

お礼日時:2008/12/12 17:07

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



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

ソースをそのまま全て載せていただければ、何かアドバイスできると思います。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/12/12 17:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!