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

スレッド1→スレッド2→スレッド1・・・と同期を取り合いながら交互にスレッドを動かしたいのですが、Thread.getState()を用いないで実現するよい方法はないでしょうか?
どうしてもデッドロックが発生しうる方法しか思いつかず困っています。
例えば以下のプログラムで1212と交互に表示させたい場合です。
以下のプログラムは当然デッドロックになりますが、やりたいことを伝えるために載せておきます。

Object obj; //スレッド間通信用のobject

class Test1 extends Thread {
 public void run() {
  while(true) {
   System.out.print("1");
   synchronized (obj) {
    obj.notify();//相手をnotifyして
    obj.wait();//自分はwait
   }
  }
 }
}

class Test2 extends Thread {
 public void run() {
  while(true) {
   System.out.print("2");
   synchronized (obj) {
    obj.notify();
    obj.wait();
   }
  }
 }
}
new Test1().start();
new Test2().start();

A 回答 (2件)

スレッド1・2を監視するスレッド3を作って3が1・2を交互に呼ぶ  じゃだめ?

    • good
    • 0
この回答へのお礼

ありがとうございます。
方法の1つとして考えてみますが、なるべく2つのスレッドのみで実現したいです。

2つのスレッドでこういうことが不可能!ということが証明されているならばあきらめがつくのですが・・・。

お礼日時:2007/05/02 21:26

「交互に」という状態を、お互いから参照できる仕組みを作る必要があるということですね?



かならず交互であるなら、スレッドは1つで、オブジェクト自身が状態を
交互に変化させるのではだめなのでしょうか?
    • good
    • 0
この回答へのお礼

質問はやりたいことを単純化したものなので、状態を変化させるという方法は使えません。
ただ、交互に処理を行いたい場合に状態を使う方法もありますね。
参考になりました。

先ほど色々試行錯誤した結果解決できたので締め切らせていただきます。
以下の方法で実現しました。

Object obj1; //スレッド間通信用のobject
Object obj2; //スレッド間通信用のobject2

class Test1 extends Thread {
 public void run() {
  while(true) {
   System.out.print("1");

   synchronized (obj1) {
    synchronized (obj2) {
     obj2.notify();//相手をnotifyして
    }
    obj1.wait();//自分はwait
   }
  }
 }
}

class Test2 extends Thread {
 public void run() {
  while(true) {
   System.out.print("2");
   synchronized (obj2) {
    synchronized (obj1) {
     obj1.notify();
    }
    obj2.wait();
   }
  }
 }
}

お礼日時:2007/05/02 22:04

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