1

私は、スレッドAがスレッドBがタスクを完了するのを待ち、スレッドBがそのタスクを完了すると、スレッドAにnotfiy()を実行して続行するプログラムを開発しました。以下はコードです。

    class ThreadA {
 public static void main(String [] args) {
 ThreadB b = new ThreadB();
 b.start();

 synchronized(b) {
 try {
 System.out.println("Waiting for b to complete...");
 b.wait();
} catch (InterruptedException e) {}
System.out.println("Total is: " + b.totals);
 }
}
}


class ThreadB extends Thread {
public  int totals;

 public void run() {
     synchronized(this) { //instance level lock
     for(int i=0;i<100;i++) {
      totals += i;
      }
      notify();
      }
      }


}

ここで、スレッドbをさらに3つのスレッドが待機しているとしましょう。スレッドAが待機しているのと同じように、さらに3つのスレッドを生成する方法を教えてください。

4

2 に答える 2

1

メソッドinvokeAll()を持つExecutorServiceを使用します。すべての ThreadB を送信し、Future のリストを保持できます。

于 2012-04-20T18:23:12.760 に答える
0

現在のコードにはstart()、最初に threadB を呼び出しているため、実際にはデッドロックの可能性が含まnotify()れていrun()ます。これは、メインの のnotify()前に呼び出すことができます。wait()これが発生した場合、threadB は永遠に待機します。

さらに ThreadB を開始するには、インスタンスをさらに作成するだけです。

ThreadB threadBs = new ThreadB[3];
for (ThreadB b : threadBs) {
    b = new ThreadB();
    b.start();
}

ただし、Thread クラスを拡張するだけでなく、Runnable インターフェイスを実装することをお勧めします。

于 2012-04-20T16:29:11.060 に答える