2011-01-24 6 views
1

私は大学の割り当てをしています(十分に率直です)。問題は、いつでも4つのクライアントスレッドを実行する必要があるということです(番号nを増やす)。そのため、スレッドが終了するたびに、新しいスレッドを生成する必要があります。メインスレッドがイベントを待機するようにする

public static void main(String[] args) throws IOException,InterruptedException 

    { 
    /* some declarations.. */ 

    ClientThread client=new ClientThread(); 

Runnable intr =client; 

for(count=1;count<=number;count++) 

{ 
       /* If 4 client threads has been spawned, wait until 1 of them exits */ 
      while(Thread.activeCount()<5) 
      ; 
      new Thread(intr).start(); 
    } 


     /* Wait until all other threads exits. */ 
     while(Thread.activeCount()!=1) 
     ; 

System.out.println("\n The sum of factorials is: "+client.getResult()); 
    } 

私のプログラムの目的を打ち負かすため、ビジー待機を取り除きたいと思います。どうすればメインスレッドを作ることができますか?wait ?? (これはwaitが非静的メソッドであり、静的メソッドから呼び出すことはできないことを示しています)助けてください。

+0

複数のスレッドを使用して階乗を計算していない限り、複数のスレッドを使用するのは1つを使用するよりも遅くなる可能性があります。 –

+0

私は 'n'個の階乗の合計を計算しなければなりません:1!+2!+ .. + n!各階乗計算は独立しています(サーバーによって別のスレッドを使用します)。それはまだ遅いですか?私は、私の教授が言ったことを実装することは考えていません。 : -/ – letsc

答えて

5

java.util.concurrent。 CountDownLatchはあなたのケースに合わせて設計されています。

doneSignal.countDown()が4回呼び出されるまで待機しますCountDownLatch doneSignal = new CountDownLatch(4);

doneSignal.await()を定義します。 が終了したときにClientThreadsが参照番号doneSignalを保持するようにするには、doneSignal.countDown()を呼び出します。

class ClientThread implements Runnable { 
    private final CountDownLatch doneSignal; 
    ClientThread (CountDownLatch doneSignal) { 
     this.doneSignal = doneSignal; 
    } 
    public void run() { 
     try { 
     //Do something 
     doneSignal.countDown(); 
     } catch (InterruptedException ex) {} 
    } 
} 
... 
//In main thread 
doneSignal.await(); 
+0

これは実際に動作しましたか?これは、メインスレッドを解放する前に4つのスレッドが終了するのを待っているようですが、クライアントスレッドがメインスレッドを終了するたびに問題が発生し、直ちに別のスレッドが生成されるはずです。 –

-1

メインスレッドのためには使用することができます。すべての生成されたスレッドが死ぬことのために、メインスレッドが終了する前に

Thread.getCurrent().join(); 

これは、待機します。

5

うーん - あなたは手でそれをしなければならないか、またはあなたの先生はあなたがExecutors.newFixedThreadPool(4)を発見することを期待していますか?

これは、4つのワーカースレッドを持つスレッドプールが行うことです。つまり、4つ以上のクライアントが並列に実行されない場合、1つが終了すると、フリーのワーカースレッドは「新しいジョブを取得する」状態になります。


これは非常に簡単です:

public void test(int threads, int runnables) { 
    ExecutorsService pool = Executors.newFixedThreadPool(threads); 
    Runnable r = new Runnable() { 
    public void run() { 
     // calculate a factorial or do something else 
     System.out.println(Thread.currenThread()); 
    } 
    } 
    for (int i = 0; i < runnables; i++) 
    pool.execute(r); 
} 

runnablesthreads、その後大きくなるしようとあなたがスレッドの最大でthreads数が(再)ランナブルを実行するために使用されているという結果からわかります。

+0

私はExecutorsとCountDownLatchの間で決める必要があります... CountDownLatchは実装がかなり簡単です。 – letsc

1

メインスレッドには、既存のスレッドによって呼び出され、新しいスレッドを呼び出すコールバックメソッドを記述できます。メインクラスの静的フィールドを使用すると、現在のコードと同じ効果を得るために生成されるスレッドの数を追跡できます。

それは次のように何とかなります

class Main{ 

    private static ClientThread client; 
    private static Runnable intr; 
    private static int count; 

    public static void main(String[] args) 
    { 
     count = 10; //Or something else 
     runningThreads = 0; 
     client=new ClientThread(); 
     intr =client; 
     for(i=0;i<5;i++) 
      spawnThread(); 
    } 

    private static void spawnThread() 
    { 
     Thread newThread; 
     if(count>0) 
     { 
      newThread = new Thread(intr); 
      newThread.start(); 
      count--; 
     } 

     if(count==0) 
      System.out.println("\n The sum of factorials is: "+client.getResult()); 
    } 
0

は、具体的に java.util.concurrent.CountDownLatch java.util.concurrent.locks.Condition

java.util.concurrentの のクラス@を見てください
関連する問題