0

問題が発生しました。グルが助けてくれることを願っています。

一度に生成されるスレッドの数を 5 に制限したいマルチスレッド Java アプリケーションを設計しています。main() プログラムは一時停止し、スレッドがプールから利用可能になるまで待機してから、プロセスを再開する必要があります。

現時点で私が思いついたのは次のとおりですが、アクティブなスレッドの数を検出する方法はあまり正確ではないようです。

これを行う別の方法があるかどうか疑問に思っています。

ExecutorService pool = Executors.newFixedThreadPool(5);

for(int i=0; i<10000; i++){    
  System.out.println("current number of threads: "+((ThreadPoolExecutor)pool).getActiveCount());

  while(true){
      if (((ThreadPoolExecutor)pool).getActiveCount() < 5)
          break;
      Thread.sleep(TimeUnit.SECONDS.toMillis(1));
      System.out.println("waiting ..... "+((ThreadPoolExecutor)pool).getActiveCount());
  }

  Runnable sampleThread = new SampleThread(100);
  pool.submit(sampleThread );
}

**************************************************
** Output:
**************************************************
current number of threads: 0
current number of threads: 1
current number of threads: 1
current number of threads: 1
current number of threads: 1

私がやろうとしていることを達成する別の方法はありますか? 私はいくつかの調査を行いましたが、法案に完全に適合するものはありません。

前もってありがとう、エドモンド

4

3 に答える 3

1

SampleThread が何をするのかを知らずに答えるのは難しいです。時間がかからない場合は、ループが続行する前にスレッドが終了している可能性があります。例えば

public static class SampleThread implements Runnable {
    @Override
    public void run() {
    }

}

戻り値

current number of threads: 0
current number of threads: 0
current number of threads: 0
current number of threads: 0
current number of threads: 0
current number of threads: 0
current number of threads: 0

しかし

public static class SampleThread implements Runnable {
    @Override
    public void run() {
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            System.out.println(e);
        }
    }
}

戻り値

current number of threads: 0
current number of threads: 1
current number of threads: 2
current number of threads: 3
current number of threads: 4
current number of threads: 5
waiting ..... 0
current number of threads: 0
current number of threads: 1
current number of threads: 2
current number of threads: 3
current number of threads: 4
current number of threads: 5
waiting ..... 0

SampleThread が何をするかについての情報で投稿を編集できますか?

于 2013-11-01T19:16:48.050 に答える
1

これについては、java.util.concurrent.Executors の newFixedThreadPool です。すでに 5 つのスレッドに制限されています。それ以上のモデレーションなしで、5 つのスレッドに制限されていないことを確認しますか?

于 2013-11-01T18:44:17.273 に答える
0

ありがとう、サンプル スレッドは、クライアントに電子メール通知を送信する責任があります。

メールの送信(最大100件)に時間がかかるため、スレッドキューが過負荷になり、メモリリソースが枯渇することが懸念されます。

気になることはありますか?

于 2013-11-02T05:57:14.483 に答える