最後に、スレッドプールの値(b)は重要であるスループットのデザインは、受信キュー、私たちは36に変更し、ブロッキングキューを見てみましょう無限のLinkedBlockingQueueを使用します。
輸入java.util.concurrentの*。; / ** * https://www.cnblogs.com/silyvin/p/11806859.html * https://www.cnblogs.com/silyvin/p/11875907.html * 2019年11月6日にジョイスによって作成されます。 * / @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.SECONDS) @Threads(40) @state(Scope.Thread) パブリッククラスMyThread { プライベート静的最終ThreadPoolExecutor MQ_POOL =て、新しいThreadPoolExecutor( 4、4、0L、TimeUnit.MILLISECONDS 、新しいLinkedBlockingQueue <>(36)、 新しいDefaultThreadFactory)( "mq-"真)。 パブリック静的クラスアクションが実装呼び出し可能<整数> { @Override パブリック整数コール()は例外をスロー{ int型、A = 0; Thread.sleep(2000); System.out.println(A)。 返します。 } } @Benchmark 公共の静的な無効テスト(){ 試み{ フューチャー<整数>私は= MQ_POOL.submit(新しいアクション()); i.get(); }キャッチ(RejectedExecutionException電子){ するSystem.out.println( "放弃" + e.getMessage())。 }キャッチ(例外e){ e.printStackTrace(); } } 公共の静的な無効メイン(文字列[] f)はRunnerException {スロー // JHM压力测试 新しいOptionsBuilderを()= OPTオプションは、(MyThread.class.getSimpleName())フォーク(1).warmupIterations(0)。 .measurementIterations(1).build(); 新しいランナー(OPT).RUN(); //自己的压力测试 MyYali.start(40)。 } プライベート静的クラスMyYali実装Runnableを{ 公共の静的な無効開始(int型THREADCOUNT){ (I = 0のint; I <THREADCOUNT; ++ i)について{ 。新しいスレッド(新しいMyYali()))(スタート。 } } //这个地方如果用1不会出错 プライベートint型のカウント= 2; @Override ます。public void実行(){ のために(int型私= 0;私は<カウント; ++ I){ テスト(); } } } }
2回のJHM自身のサイクルで測定された圧力
キューの長さ36を遮断する複数の、それぞれの出現において、19 1にかなり安定4印刷をあきらめ、放棄する「0」の応答時間28
放棄されていない37のキュー長をブロックすると、20は、応答時間を与えませんでした
サイクル数1
キューの長さ36をブロックする/与えるものではありませんでした
キューの長さ37をブロックする/与えるものではありませんでした
放弃タスクjava.util.concurrent.FutureTask@1339fcefがjava.util.concurrent.ThreadPoolExecutor@300fa78cから拒否[ランニング、プールサイズ= 4、アクティブなスレッド= 4、キューに入れられたタスク= 35、完了したタスク= 14]
組み合わせて、すべての投機現象によると、キューのブロッキング手書きスレッドの36アウトが拒否された理由を削減し、