4種類のExcutorSerivce

4475 ワード

new threadとの違いについては、延長しません.利点:(copyネット上の解釈)a.存在するスレッドを再利用し、オブジェクトの作成、消滅のオーバーヘッドを低減し、性能が良い.b.最大同時スレッド数を効果的に制御し、システム資源の使用率を高めると同時に、多すぎる資源競争を避け、渋滞を避けることができる.c.タイミング実行、定期実行、単一スレッド、同時数制御などの機能を提供する.4種類のExcutorServices:newCachedThreadPoolはキャッシュ可能なスレッドプールを作成し、スレッドプールの長さが処理の必要以上であれば、空きスレッドを柔軟に回収し、回収できない場合は新しいスレッドを作成します.新FixedThreadPoolは、スレッドの最大同時数を制御し、超過したスレッドがキュー内で待機する定長スレッドプールを作成します.新ScheduledThreadPoolは、タイミングおよび周期的なタスク実行をサポートする定長スレッドプールを作成します.新SingleThreadExecutorは、一意の作業スレッドのみでタスクを実行し、すべてのタスクが指定された順序(FIFO、LIFO、優先度)で実行されることを保証する単一スレッド化されたスレッドプールを作成します.
1、newCachedThreadPoolは無限スレッドプールサイズのスレッドプールとして理解する
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
        for (int i = 0; i < 10; i++) {
            final int index = i;
            cachedThreadPool.execute(new Runnable() {

                @Override
                public void run() {
                    System.out.println(index);
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
        }


無限スレッドプールのサイズである以上、なぜ直接new 1つのThreadを使用しないのか、スレッドプールを使用して空きスレッドを回収することができ、回収可能な状況がない場合、新しいスレッドを作成するので、毎回直接new 1つのThreadに比べて、新しいスレッドの消費時間を減らし、リソースの利用性を増加させることができる.(単純Sysoutの10万個のスレッドをプライベートでテストしたが,時間は2400 ms:460 ms)2,newFixedThreadPool定長のスレッドプール,スレッド数が超過した場合,待機する.これはよく理解できて、説明しません.
ExecutorService executorService = Executors.newFixedThreadPool(5);
        for (int i = 0; i < 10; i++) {
            final int index = i;
            executorService.execute(new Runnable() {

                @Override
                public void run() {
                    System.out.println(index);
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            });
        }

3、newSingleThreadExecutor単一スレッドのスレッドプール.newFixedThreadPool(1)と同様に、一般的なシーンでは、特定の順序でタスクを実行するために使用されます.
    ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
        for (int i = 0; i < 10; i++) {
            final int index = i;
            singleThreadExecutor.execute(new Runnable() {
                @Override
                public void run() {
                    try {
                        System.out.println(index);
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
        }

4、newScheduledThreadPool、定長ラインプール、タイミングと周期的な任務をサポートする.
scheduleAtFixedRate(task,delay,period,timeUtil):前のタスクから実行を開始した後、periodサイクル後に次のタスクを実行しますが、前のタスクが完了していない場合は、前のタスクが先にscheduleWithFixedDelay(task,dalay,period,timeUtil):前のタスク終了後、p'eriodサイクルから次のタスクschedule(task,period,timeUtil):period秒後に実行を開始します.
    ScheduledExecutorService executorService = Executors.newScheduledThreadPool(3);

        executorService.schedule(new Runnable() {

            @Override
            public void run() {
                System.out.println("yes");

            }
        }, 3, TimeUnit.SECONDS);
        //  ,3 , , 
        executorService.scheduleAtFixedRate(new Runnable() {

            @Override
            public void run() {
                System.out.println("Atfixed");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
        }, 1, 3, TimeUnit.SECONDS);

        //  ,3 
        executorService.scheduleWithFixedDelay(new Runnable() {

            @Override
            public void run() {
                System.out.println("fixed");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }, 1, 3, TimeUnit.SECONDS);

新ScheduledThreadPoolとTimerはjdk 1から少し似ていると思いますか?5以降、Timerの代わりにnewScheduledThreadPoolを使用することをお勧めします.機能は似ていますが、安定性などの面ではtimerより高いからです.