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

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

解決済みの質問

スレッド1とスレッド2を交互に実行するには?

スレッド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();

投稿日時 - 2007-05-02 21:01:13

QNo.2968378

すぐに回答ほしいです

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

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

投稿日時 - 2007-05-02 21:13:30

お礼

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

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

投稿日時 - 2007-05-02 21:26:16

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

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

回答(2)

ANo.2

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

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

投稿日時 - 2007-05-02 21:29:58

お礼

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

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

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:27

あなたにオススメの質問