2012-04-20 4 views
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(); 
     } 
     } 


} 

今私が欲しいので、スレッドAが待っているだけのよう、アドバイスしてください、3つの以上のスレッドを生成する方法を私に助言してください、3より多くのスレッドはスレッドBを待っていると言うことができます。

+3

私は、あなたの最後の質問で提案したいくつかの提案を実行することから始めます:パブリックフィールドを取り除く、*スレッドを拡張しない*スレッドを呼び出さない*スレッドオブジェクトを通知する* (彼らはあなたを混乱させます。) –

+1

あなたは正しくインデントしてください(私はあまりにもbtw)。それは適切に読んで見るのに役立ちます。 – Coffee

+0

@jon、えええええええええええええええええええええええええええええええええええええええええええええええば助かります – dghtr

答えて

0

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

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

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

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

+0

こんにちはEvanwong、ありがとうたくさん、よく私はrun()メソッドの開始時にnotify()を呼び出すと、それはiilegalモニタ状態の例外をスローします...あなたはデッドロックについて詳しく説明してください、それは大きな助けになるでしょうか私は複数のスレッドを開始したいと思って、スレッドBがタスクを最初に終了するのを待っている3つの新しいスレッドを想定します。お知らせ下さい – dghtr

1

ExecutorServiceを使用してください。方法はinvokeAll()です。あなたはあなたのすべてのThreadBを提出し、将来のリストを保持することができます。

関連する問題