Javaマルチスレッドプログラミング-スレッドプール


スレッドプール
スレッドプールを使用する理由
スレッドの作成、破棄は、システムリソースのオーバーヘッドを増加させ、プログラムのパフォーマンスを低下させます.
頻繁にリソースを作成、破棄しないようにします.N個のスレッドが入ったプールを作成し、スレッドを使用する必要がある場合はスレッドプールから取得し、使用が完了したらスレッドをスレッドプールに戻してスレッドの再利用を達成することができます.
スレッドプールの原理
例:
スレッドプールには3つのスレッドが割り当てられ、4つのタスクが実行される必要がある場合は、3つのスレッドを割り当ててタスクを実行し、4番目のタスクは3つのスレッドのいずれかのスレッドのタスクが実行されるまで待機し、空きスレッドがスレッドプールに戻り、タスク4が空きスレッドに割り当てられて実行されます.
スレッドプールにタスクをコミットし、スレッドプールによってスレッドを割り当て、タスクを実行し、現在のタスクが終了した後にスレッドを多重化します.
スレッドプールの作成
一般的なスレッドプールインタフェースとクラス
  • Executor:スレッドプールトップレベルインタフェース
  • ExecutorService:スレッドプールインタフェースsubmit(Runnable task)を介してタスク
  • をコミット
  • Executors:スレッドプール
  • を取得できるファクトリクラス
    Executorsクラス
    newFixedThreadPool(int nThreads)   ,         
    newCachedThreadPool   ,           ,        ,    

    スレッドプール基本使用1
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    public class ThreadDemo2 {
    
        public static void main(String[] args) {
            // 1.      
            ExecutorService es = Executors.newFixedThreadPool(4);
            // 2.     
            Runnable r = new Runnable() {
                private int ticker = 100;
    
                @Override
                public void run() {
                    while (true) {
                        if (ticker <= 0) {
                            break;
                        }
                        System.out.println(Thread.currentThread().getName() + "    " + ticker + "  ");
                        ticker--;
                    }
                }
            };
            // 3.     
            for (int i = 0; i < 4; i++) {
                es.submit(r);
            }
            // 4.       shutdown                  ,   shutdownNow           ,       
            es.shutdown();
        }
    
    
    }
    

    補足:
    Executors.新FixedThreadPool(4)固定個数のスレッドプールを作成する;Executors.newCachedThreadPool(); タスクに応じてスレッド数が決定されるバッファスレッドプールを作成します.Executors.newSingleThreadExecutor(); 単一スレッドのスレッドプールを作成します.スレッド数は1 Executorsです.newScheduledThreadPool(4); スケジューリングスレッドのスレッドプールの作成