4 Javaのスレッドプールスレッドプールの使用状況の種類だけでなく、役割および利点は、あなたがまだ知っていますか?

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

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

复制代码
1、まず頻繁に破壊し、作成したオブジェクトは、非常に消費する事性能です。
2を超えるユーザーならば、資源の過剰消費につながることは、リソース不足やダウンタイムの私たちのサービスにつながる可能性があり、
3.要約すると、実際の開発では、この操作は実際に望ましい方法です。

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

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

スレッドプールを使用するには、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();
}

复制代码
結果
そして、その結果を見て、私たちは3つのスレッドを変更しました
長所:結果の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();
}

复制代码
結果

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

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

遂に

私は、データのコンパイルが内側になり、記事が更新される中でみんなの注目公共の群れ番号[プログラマ]を、お待ちしております。

おすすめ

転載: juejin.im/post/5db28898e51d452a161df452
おすすめ