DIER 18:Javaスレッドプール4つの使用と使用のシナリオ

免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
このリンク: https://blog.csdn.net/weixin_43392489/article/details/102760366

スレッドプールの主な役割は、システムのパフォーマンスと使用状況を改善することです。冒頭で言及した記事で、私たちは、ユーザーの大規模な量は、それが作成し、しているスレッドの消費性能を作成し、破壊しているサーバーが発生したスレッドを、破壊行動の多くを生成する場合は、スレッドを作成する最も簡単な方法を使用している場合実際の業績の時間とコストを処理するよりも。

著者:Xiaotao

 まず、次のように質問があります

new Thread() { 
    @Override 
    public void run() { 
        // 业务逻辑 
    } 
}.start(); 

1は、最初に頻繁に作成し、オブジェクトを破壊する非常に消費する事性能であり、より大きなユーザーならば、資源の過剰消費につながることは、リソース不足やダウンタイムの私たちのサービスにつながる可能性があり、2; 3、合計後述する、実際の開発では、この操作は、実際に望ましい方法です。

第二に、スレッドプールを使用する利点は何ですか

効果的に、サーバリソースの使用を改善するため、資源やその他の問題の不足のためにダウンタイムを回避するために、スレッドプール内のスレッド数を制御することができ、2; 1は、破壊、オブジェクトの作成を減らすために、スレッドプール内のスレッドの利用率を高めるために、

スレッドプールを使用するには、3つのまたは4つの方法

1 、newCachedThreadPool

プール内のスレッドの数が多すぎる場合、スレッドの数は、それが新しいスレッドを作成することができれば、それは効果的に、余分なスレッドを回復することができる、スレッドプールを作成します。

public static void method() throws Exception { 

    ExecutorService executor = Executors.newCachedThreadPool(); 

    for (int i = 0; i < 5; i++) { 

        final int index = i; 

        Thread.sleep(1000); 

        executor.execute(new Runnable() { 
            @Override 
            public void run() { 
                System.out.println(Thread.currentThread().getName() + "  " + index); 
            } 
        }); 
    } 
} 

結果

我々は明らかに今、私たちが交互に実行するために、いくつかのスレッドを必要とする、見ることができます。

不十分:このメソッドは、スレッド数を自動的に展開するが、どのように多くのスレッドが不足しているを処理するために取ることができ、ビジネス・シナリオに基づいて、当社のビジネスを扱うことができますが、当社の制御を超えています。

長所:2番目のタスクが開始されたときや、最初のタスクの終了が実行された場合は、2番目のタスクは、最初のタスクにスレッドを作成し、再され、そして、新しいスレッドを再作成スレッドの再利用率を増加させないであろう;

2 、newFixedThreadPool

この方法は、あなたは、プール内のスレッドの数を指定することができます。栗の場合、最大の銭湯は外で待っだけの人に戻って、その後、風呂に同時に20人を収容することができます。ハードは、内部の摩擦をこすりシーンの後、唯一の出現を、急いでいる場合...

最初のスレッドの最大容量をテストし、それが私たちの予測可能な結果ではありません。

public static void method_01() throws InterruptedException { 

    ExecutorService executor = Executors.newFixedThreadPool(1); 

    for (int i = 0; i < 10; i++) { 

        Thread.sleep(1000); 
        final int index = i; 

        executor.execute(() -> { 
            try { 
                Thread.sleep(2 * 1000); 
            } catch (InterruptedException e) { 
                e.printStackTrace(); 
            } 
            System.out.println(Thread.currentThread().getName() + "  " + index); 
        }); 
    } 
    executor.shutdown(); 
} 

 

長所:結果の2つの連結損益計算書、我々は、使用状況の最大スレッド最大のヒットを制御することにより、当社のサーバーを作る同僚とタイムリーな流れが急激に増加することを確認できることができるように、制御することができるスレッドnewFixedThreadPoolの数は反映されませんあまりにも多くのサーバリソース。

3 、newScheduledThreadPool

スレッドプールは、タイミングやタスクの実行の周期性をサポートするために、我々は、タスクの実行時間を遅らせることができます、また繰り返し定期的なタスクのための時間を設定することができます。スレッドプールの方法は、次の2つの遅延を持っています。

  • scheduleAtFixedRate

テスト1

public static void method_02() { 
    ScheduledExecutorService executor = Executors.newScheduledThreadPool(5); 

    executor.scheduleAtFixedRate(new Runnable() { 
        @Override 
        public void run() { 
            long start = new Date().getTime(); 
            System.out.println("scheduleAtFixedRate 开始执行时间:" + 
                    DateFormat.getTimeInstance().format(new Date())); 
            try { 
                Thread.sleep(5000); 
            } catch (InterruptedException e) { 
                e.printStackTrace(); 
            } 
            long end = new Date().getTime(); 
            System.out.println("scheduleAtFixedRate 执行花费时间=" + (end - start) / 1000 + "m"); 
            System.out.println("scheduleAtFixedRate 执行完成时间:" + DateFormat.getTimeInstance().format(new Date())); 
            System.out.println("======================================"); 
        } 
    }, 1, 5, TimeUnit.SECONDS); 
} 

 

概要:二つの方法上記のさまざまな場所では間隔は、タスクの実行時間よりも大きい場合、タスクは実行時に影響されない、タスクの実行時間です。期間は、タスクの実行時間未満の場合、任務の終了後、すぐに間隔が中断されますこれまでのところ、実装されます。

  • scheduleWithFixedDelay

テスト1

public static void method_03() { 
    ScheduledExecutorService executor = Executors.newScheduledThreadPool(2); 

    executor.scheduleWithFixedDelay(new Runnable() { 
        @Override 
        public void run() { 
            long start = new Date().getTime(); 
            System.out.println("scheduleWithFixedDelay 开始执行时间:" + 
                    DateFormat.getTimeInstance().format(new Date())); 
            try { 
                Thread.sleep(1000); 
            } catch (InterruptedException e) { 
                e.printStackTrace(); 
            } 
            long end = new Date().getTime(); 
            System.out.println("scheduleWithFixedDelay执行花费时间=" + (end - start) / 1000 + "m"); 
            System.out.println("scheduleWithFixedDelay执行完成时间:" 
                    + DateFormat.getTimeInstance().format(new Date())); 
            System.out.println("======================================"); 
        } 
    }, 1, 2, TimeUnit.SECONDS); 
} 

テストの二つ

public static void method_03() { 
    ScheduledExecutorService executor = Executors.newScheduledThreadPool(2); 

    executor.scheduleWithFixedDelay(new Runnable() { 
        @Override 
        public void run() { 
            long start = new Date().getTime(); 
            System.out.println("scheduleWithFixedDelay 开始执行时间:" + 
                    DateFormat.getTimeInstance().format(new Date())); 
            try { 
                Thread.sleep(5000); 
            } catch (InterruptedException e) { 
                e.printStackTrace(); 
            } 
            long end = new Date().getTime(); 
            System.out.println("scheduleWithFixedDelay执行花费时间=" + (end - start) / 1000 + "m"); 
            System.out.println("scheduleWithFixedDelay执行完成时间:" 
                    + DateFormat.getTimeInstance().format(new Date())); 
            System.out.println("======================================"); 
        } 
    }, 1, 2, TimeUnit.SECONDS); 
} 

 

要約:同じ、同じscheduleWithFixedDelay試験方法を用いて、時間間隔を測定することができるscheduleWithFixedDelayタスクの実行が影響の時間の長さに影響されません。

4 、newSingleThreadExecutor

これは、シングルスレッド・プールで、実行するスレッドが終了するのを開始します。

public static void method_04() { 

    ExecutorService executor = Executors.newSingleThreadExecutor(); 

    for (int i = 0; i < 5; i++) { 
        final int index = i; 
        executor.execute(() -> { 
            try { 
                Thread.sleep(2 * 1000); 
            } catch (InterruptedException e) { 
                e.printStackTrace(); 
            } 
            System.out.println(Thread.currentThread().getName() + "   " + index); 
        }); 
    } 
    executor.shutdown(); 
} 

 

第四に、スレッドプールの役割

スレッドプールの主な役割は、システムのパフォーマンスと使用状況を改善することです。冒頭で言及した記事で、私たちは、ユーザーの大規模な量は、それが作成し、しているスレッドの消費性能を作成し、破壊しているサーバーが発生したスレッドを、破壊行動の多くを生成する場合は、スレッドを作成する最も簡単な方法を使用している場合実際の業績の時間とコストを処理するよりも。このスレッドプールが発生するような問題を解決することを目的とします。

同様に、そこにあるため、データベースへの頻繁な接続のようなデータベース接続プールなど、多くのデザインのアイデアは、ですが、接続を作成すると、パフォーマンスがかかり事で、すべてのデータベース接続プールが登場しました。

カタログ(上)(長期更新コンピュータのドメイン知識)読みます

カタログ(上)(長期更新コンピュータのドメイン知識)読みます

カタログを読む(上)(長期科学技術の知識)

曲は、Javaの顔の質問を見てあなたを取ります

 

おすすめ

転載: blog.csdn.net/weixin_43392489/article/details/102760366