スレッドプールのいくつかのパラメータ、多くの人々がそれらの間の関係は何であるか、設定方法には非常に明確ではないが、私はそれを証明するために、コードを使用しています。
用パッケージ変更www.itbac.com; インポート java.util.concurrentの*。; パブリック クラスExecutorTest { 公共 静的 ボイドメイン(文字列[]引数){ // スレッドプール、スレッドの定義:(コア数、スレッドの最大数を作成し、プラスオープンスレッド生存期間、時間単位、タスクキューの長さ) ThreadPoolExecutorプール= 新しい新しい ThreadPoolExecutor(5 ,. 8。 、 0L 、TimeUnit.MILLISECONDS、 新しい新しい LinkedBlockingQueue <Runnableを>(2 )); // 設定:タスクの数= 3〜11、分析:ジョブの数とアクティブなスレッドの数、スレッドのコア数、キュー長、スレッドの最大数との関係。 INT A = 3。; のための(INT I = 1; I <= A; I ++){ のInt J = I; pool.submit(新しい新しいRunnableを(){ @Override 公共 ボイドRUN(){ // スレッドの名前を取得 スレッドthread = にThread.currentThreadを(); 文字列名 = Thread.getName(); // 出力 INTはactiveCount = pool.getActiveCount(); のSystem.out.println( "タスク:" + J + "-----、スレッド名:" +名+ "-----アクティブなスレッドの数:" + はactiveCount); } }); } //閉じるスレッドプール pool.shutdown(); } }
出力は、関係を守ってください。
//タスクA = 3、数3、タスクの数<スレッドのアクティブなスレッドのコア数の数。
//タスクA = 4、数4、タスクの数<スレッドのアクティブなスレッドのコア数の数。
//タスクA = 5の数、アクティブなスレッド5、タスク=スレッドのコア数の数。
//タスクA = 6の数、アクティブなスレッド5の数、タスク数<数5芯糸2 +キューの長さ。
//タスクA = 7の数、アクティブなスレッド5の数、タスク数= 5本の芯糸2 +キューの長さ。
//タスクA = 8の数、アクティブなスレッド6の数、タスク数<スレッド8 + 2の最大キューの長さの数。アクティブなスレッドの数がスレッド5、プラスアクティブなスレッドのコアの数に基づいています。
//タスクA = 9の数、アクティブなスレッド7の数、タスク数<スレッド8 2 +キュー長の最大数。アクティブなスレッドの数がスレッド5、と2つのアクティブなスレッドのコアの数に基づいています。
//タスクA = 10の数、アクティブなスレッド8の数、タスク数=スレッド8 2 +キュー長の最大数。アクティブなスレッドの数がスレッド5、加えて3つのアクティブなスレッドのコアの数に基づいています。
//タスクA = 11の数、アクティブなスレッド8の数、タスク数>スレッド8 2 +キュー長の最大数。スローさRejectedExecutionException
要約:
タスクの数が増加すると、それがアクティブなスレッドの数が増加します。
ときにアクティブなスレッドの数=スレッドのコア数は、今では、アクティブなスレッドの数を増やしますが、タスクキューの蓄積にはありません。
タスクキューがいっぱいになると、任務の数の増加と、それはカーネル・スレッドの数に基づいて追加のスレッドを提供します。
アクティブなスレッド=スレッドの最大数の数まで、スレッドを大きくすることができません。
タスクはまだこの時、で増加している場合は、次のタスク番号11>スレッドの最大数を8 2 +キューの長さ、スローRejectedExecutionExceptionは、タスクを拒否します。