ThreadPoolExecutorプルーフスレッドプール、スレッドの最大数、キュー長のスレッドのコア数との関係

スレッドプールのいくつかのパラメータ、多くの人々がそれらの間の関係は何であるか、設定方法には非常に明確ではないが、私はそれを証明するために、コードを使用しています。

用パッケージ変更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は、タスクを拒否します。

 

おすすめ

転載: www.cnblogs.com/itbac/p/11306465.html