JAvaスレッドプールの作成の4つの方法


Javaスレッドプールの使用説明
スレッドプールの役割:スレッドプールの役割は、システム内で実行されるスレッドの数を制限することです.システムの環境状況に応じて、スレッドの数を自動的にまたは手動で設定し、実行の最適な効果を達成することができます.システム資源の浪費が少なく、システムの混雑効率が高くない.スレッドプールでスレッド数を制御し、他のスレッドが並んで待機します.1つのタスクの実行が完了し、キューから先頭のタスクを取り出して実行を開始します.キューにプロセスが待機していない場合、スレッドプールのこのリソースは待機しています.新しいタスクが実行される必要がある場合、スレッドプールに待機している作業スレッドがあれば、実行を開始できます.そうでなければ待機キューに入ります.
JAvaでよく使われるスレッドプール
  • newSingleThreadExecutorは、単一スレッドのスレッドプールを作成します.このスレッドプールでは、1つのスレッドのみが動作します.つまり、1つのスレッドがすべてのタスクをシリアルで実行することに相当します.この唯一のスレッドが異常に終了した場合、新しいスレッドが置き換えられます.このスレッドプールは、すべてのタスクの実行順序がタスクのコミット順序で実行されることを保証します.2.newFixedThreadPool固定サイズのスレッドプールを作成します.タスクをコミットするたびに、スレッドがスレッドプールの最大サイズに達するまで、スレッドプールからスレッドを取得します.スレッドプールのサイズは、最大値に達すると変更されず、実行異常によってスレッドが終了すると、スレッドプールに新しいスレッドが追加されます.
  • newCachedThreadPoolキャッシュ可能なスレッドプールを作成します.スレッドプールのサイズがタスクの処理に必要なスレッドを超えると、空き(60秒でタスクを実行しない)のスレッドの一部が回収され、タスク数が増加すると、このスレッドプールはスマートに新しいスレッドを追加してタスクを処理することができます.このスレッドプールはスレッドプールのサイズに制限はありません.スレッドプールのサイズは、オペレーティングシステム(またはJVM)が作成できる最大スレッドサイズに完全に依存します.4.newScheduledThreadPoolは、タイミングおよび周期的なタスクの実行をサポートするスレッドプールを作成します.多くの場合、Timerクラス
  • の代わりに使用することができる

    単線スレッドプールExecutors.newSingleThreadExecutor()
    import java.util.concurrent.Callable;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    public class Chi {
        public static void main(String[] args) {
            /*        
            Runnable r = new MyRunnable();
            Thread t = new Thread(r);
            t.start();*/
    
    ExecutorService e =Executors.newSingleThreadExecutor();//           
            e.submit(new MyRunnable());
            e.submit(new MyRunnable());
            e.submit(new MyRunnable());
            e.submit(new MyRunnable());
            e.submit(new MyRunnable());
            e.submit(new MyRunnable());
            e.shutdown();
        }
        }
    
    class MyRunnable implements Runnable{
    @Override
        public void run() {
            System.out.println("      :"+Thread.currentThread().getName());
            try {
                System.out.println("        "+Thread.currentThread().getName());
                Thread.sleep(2000);
                System.out.println("      "+Thread.currentThread().getName());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("       "+Thread.currentThread().getName());
        }
        }

    実行結果はスレッドをください:pool-1-thread-1スレッド消費リソースpool-1-thread-1スレッド使用済みpool-1-thread-1スレッドプールに戻るpool-1-thread-1スレッド消費リソースpool-1-thread-1スレッド使用済みpool-1-thread-1スレッドスレッドスレッド使用済みpool-1-thread-1スレッドをスレッドプールに返すpool-1-thread-1スレッド消費開始スレッド:pool-1-thread-1スレッド消費開始スレッドリソースpool-1-thread-1スレッド使用済みpool-1-thread-1スレッド使用済みpool-1-thread-1スレッドスレッド使用済みpool-1-thread-1スレッド使用済みpool-1-thread-1スレッド使用済みpool-1-thread-1スレッドスレッド使用済みpool-1-thread-1スレッドスレッド使用済みpool-1-thread-1スレッド使用済みpool-1-thread-1スレッド使用済みpool-1-thread-1スレッド使用済みpool-1-thread-1スレッドプールのpool-1-thread-1スレッドをください:pool-1-thread-1スレッドリソース消費を開始pool-1-thread-1スレッド使用済みpool-1-thread-1スレッドスレッドプールに戻るpool-1-thread-1
    固定長スレッドプールExecutorsを作成する.newFixedThreadPool()
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    public class Chi {
        public static void main(String[] args) {
            /*        
            Runnable r = new MyRunnable();
            Thread t = new Thread(r);
            t.start();*/
    
    ExecutorService e =Executors.newFixedThreadPool(2);//              
            Runnable r = new MyRunnable();
            e.submit(r);//              ,    runnable    run  
            e.submit(r);
            e.submit(r);
            e.submit(r);//  run     ,          ,       
            e.shutdown();
        }
        }
    
    class MyRunnable implements Runnable{
    @Override
        public void run() {
            System.out.println("      :"+Thread.currentThread().getName());
            try {
                System.out.println("        "+Thread.currentThread().getName());
                Thread.sleep(2000);
                System.out.println("      "+Thread.currentThread().getName());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("       "+Thread.currentThread().getName());
        }
        }

    実行結果はスレッドをください:pool-1-thread-1スレッドをください:pool-1-thread-2スレッドリソースの消費を開始pool-1-thread-1スレッドリソースの消費を開始pool-1-thread-2スレッド使用済みpool-1-thread-1スレッド使用済みpool-1-thread-1スレッド使用済みpool-1-thread-2スレッド使用済みpool-1-thread-1スレッド消費開始リソースpool-1-thread-1スレッド使用済みプールのpool-1-thread-2私に1つのスレッドをあげます:pool-1-thread-2スレッドは資源pool-1-thread-2スレッドを消費し始めました使用済みpool-1-thread-1スレッドをスレッドプールのpool-1-thread-1スレッドに返します使用済みpool-1-thread-2スレッドプールのpool-1-thread-2に返します
    キャッシュ可能なスレッドプールの作成
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    public class Chi {
        public static void main(String[] args) {
            /*        
            Runnable r = new MyRunnable();
            Thread t = new Thread(r);
            t.start();*/
            ExecutorService e =Executors.newCachedThreadPool();
            Runnable r = new MyRunnable();
            e.submit(r);//              ,    runnable    run  
            e.submit(r);
            e.submit(r);
            e.submit(r);//  run     ,          ,       
            e.shutdown();
        }
        }
    
    class MyRunnable implements Runnable{
    @Override
        public void run() {
            System.out.println("      :"+Thread.currentThread().getName());
            try {
                System.out.println("        "+Thread.currentThread().getName());
                Thread.sleep(2000);
                System.out.println("      "+Thread.currentThread().getName());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("       "+Thread.currentThread().getName());
        }
        }

    実行結果はスレッドをください:pool-1-thread-1スレッドをください:pool-1-thread-4スレッドをください:pool-1-thread-3スレッドをください:pool-1-thread-2スレッドリソース消費を開始pool-1-thread-3スレッドリソース消費を開始pool-1-thread-4スレッドソース消費を開始pool-1-thread-1スレッド消費リソースpool-1-thread-2スレッド使用済みpool-1-thread-2スレッド使用済み完了pool-1-thread-3スレッド使用完了pool-1-thread-4スレッド使用完了pool-1-thread-1スレッドプールに返却pool-1-thread-4スレッドプールに返却pool-1-thread-2スレッドプールに返却pool-1-thread-3スレッドプールに返却pool-1-thread-1
    キャッシュ可能で周期的にタスクを実行できるスレッドプールを作成
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.ScheduledFuture;
    import java.util.concurrent.ScheduledThreadPoolExecutor;
    import java.util.concurrent.TimeUnit;
    
    public class Chi {
        public static void main(String[] args) {
            /*        
            Runnable r = new MyRunnable();
            Thread t = new Thread(r);
            t.start();*/
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            ScheduledThreadPoolExecutor e = new ScheduledThreadPoolExecutor(3);//        
            System.out.println(simpleDateFormat.format(new Date()));
            //             2s               。
            ScheduledFuture> resultFuture = e.scheduleAtFixedRate(new MyRunnable(), 0, 2000, TimeUnit.MILLISECONDS);//       ,                 ,               ,          
            e.scheduleAtFixedRate(new MyRunnable1(), 0, 2000, TimeUnit.MILLISECONDS);//       ,                 ,               ,          
            // //        ,      
            //Object object = resultFuture.get();
        }
    }
    
    class MyRunnable implements Runnable{
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName()+"      :"+simpleDateFormat.format(new Date()));
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    class MyRunnable1 implements Runnable{
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName()+"      1:"+simpleDateFormat.format(new Date()));
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    実行結果2018-03-17 13:48:05 pool-1-thread-1スレッドをください:2018-03-17 13:48:05 pool-1-thread-2スレッドを1:2018-03-17 13:48:05 pool-1-thread-1スレッドをください:2018-03-17 13:48:07 pool-1-thread-1スレッドをください:2018-03-17 13:48:48:09 pool-1-thread-3スレッドをください:2018-03-17 13:48:11 pool-1-thread-3スレッドをください:2018-03-17 13:48:173 pool-1-thread-2スレッド1:2018-03-17 13:48:15 pool-1-thread-3スレッドをください:2018-03-17 13:48:15 pool-1-thread-3スレッドをください:2018-03-17 13:48:17 pool-1-thread-3スレッドをください:2018-03-17 13:48:19 pool-1-thread-1スレッドをください:2018-03-17 13:48:21 pool-1-thread-1スレッドをください:2018-03-17 13:48:23 pool-1-thread-3スレッドをくださいスレッド1:2018-03-17 13:48:25 pool-1-thread-1スレッドをください:2018-03-17 13:48:25............................