spring bootではjavaスレッド池ExectorServiceを使用します.


1.javaスレッド池を知っています.
1.1スレッド池はどのような場合に使いますか?
  • .単一タスク処理の時間が短い
  • .処理したいジョブの数は
  • です.
    1.2スレッド池を使用するメリット:
  • .スレッドの作成と廃棄にかかる時間とシステムリソースのオーバーヘッドを低減する
  • .
  • .スレッド池を使わないと、システムが大量のスレッドを作成し、システムメモリ
  • を消費してしまう恐れがある.
    1.3スレッド池は以下の4つの基本構成部分を含む.
  • 、スレッド池マネージャ(ThreadPool):スレッド池を作成して管理するためのもので、スレッド池を作成することと、スレッドプールを破壊することと、新しいタスクを追加することとを含む.
  • 、ワークスレッド(PoolWorker):スレッドのプールでは、スレッドは、タスクがないときは待機状態にあり、ループしてタスクを実行することができます.
  • 、タスクインターフェース(Task):各タスクが必ず実行されるインターフェースは、ワークスレッドスケジューリングタスクの実行のために、主にタスクの入口を規定し、タスクが完了した後の終了作業、タスクの実行状態などを規定する.
  • 、タスクキュー:未処理のタスクを格納するために使用されます.バッファ機構を提供します.
  • 1.4スレッド池のコアパラメータ
    ThreadPool Exectorは4つの構造方法があります.最初の3つは最後の呼び出しです.
     public ThreadPoolExecutor(int corePoolSize,
                                  int maximumPoolSize,
                                  long keepAliveTime,
                                  TimeUnit unit,
                                  BlockingQueue workQueue) {
            this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
                 Executors.defaultThreadFactory(), defaultHandler);
        }
    
    
        public ThreadPoolExecutor(int corePoolSize,
                                  int maximumPoolSize,
                                  long keepAliveTime,
                                  TimeUnit unit,
                                  BlockingQueue workQueue,
                                  ThreadFactory threadFactory) {
            this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
                 threadFactory, defaultHandler);
        }
    
    
        public ThreadPoolExecutor(int corePoolSize,
                                  int maximumPoolSize,
                                  long keepAliveTime,
                                  TimeUnit unit,
                                  BlockingQueue workQueue,
                                  RejectedExecutionHandler handler) {
            this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
                 Executors.defaultThreadFactory(), handler);
        }
    
        //     
        public ThreadPoolExecutor(//      
        int corePoolSize, 
                                  //      
                                  int maximumPoolSize,  
                                  //         
                                  long keepAliveTime,  
                                  //     
                                  TimeUnit unit, 
                                  //     
                                  BlockingQueue workQueue,  
                                  //       
                                  ThreadFactory threadFactory,                
                                  //     ,                                      
                                  RejectedExecutionHandler handler   ) {
            if (corePoolSize < 0 ||
                maximumPoolSize <= 0 ||
                maximumPoolSize < corePoolSize ||
                keepAliveTime < 0)
                throw new IllegalArgumentException();
            if (workQueue == null || threadFactory == null || handler == null)
                throw new NullPointerException();
            this.corePoolSize = corePoolSize;
            this.maximumPoolSize = maximumPoolSize;
            this.workQueue = workQueue;
            this.keepAliveTime = unit.toNanos(keepAliveTime);
            this.threadFactory = threadFactory;
            this.handler = handler;
        }
    
    主なパラメータ
  • corePoolSize:コアスレッド数
  • コアスレッドは常に生きています.タスクがなくても
  • を実行する必要があります.
  • スレッド数がコアスレッド数より小さい場合、スレッドが空き状態であっても、優先的に新しいスレッド処理
  • を作成する.
  • にallowCoreThed Timeout=trueを設定すると、コアスレッドがタイムアウトして
  • がオフになります.
  • maxPoolSize:最大スレッド数
  • スレッド数>=corePoolSizeで、ジョブキューがいっぱいになったとき.スレッド池は新しいスレッドを作成してタスクを処理します.
  • スレッド数=maxPoolSizeで、ジョブのキューがいっぱいになった場合、スレッドプールはジョブの処理を拒否して、異常
  • をスローします.
  • keep Alive Time:スレッド空き時間
  • スレッドの空き時間がkeep Alive Timeに達すると、スレッド数=corePoolSize
  • までスレッドが終了します.
  • allowCoreThed Timeout=trueの場合、スレッド数=0
  • まで
  • workQue:一つのブロック列は、実行待ちのタスクを格納するために使用され、このパラメータの選択も重要であり、スレッドプールの動作過程に大きな影響を与える.一般的に、ここのブロック列は以下のような選択がある.
  • ArayBlocking Que;
  • Linked Blocking Que;
  • Synch ronousQue;渋滞行列についてはこれを見てもいいです.java渋滞行列
  • threadFactory:スレッド工場は主にスレッドを作成するために使用されます.
  • rejectedExectionHandler:ジョブ拒否プロセッサ、2つの場合は処理タスクを拒否します.
  • スレッド数がmaxPoolSizeに達したとき、切断列がいっぱいになりました.新しいタスク
  • を拒否します.
  • スレッドのプールがshutdown()に呼び出されると、スレッドの池のタスクが実行されるのを待って、shutdownに戻ります.shutdown()とスレッドプールの本当にshutdown間でタスクを提出すると、新しいタスク
  • を拒否します.
  • は、ジョブの処理を拒否すると、スレッド池がrejectedExectionHandlerを呼び出してこのタスクを処理します.デフォルトがAbortPolicyに設定されていないと、異常が発生します.ThreadPool Exector類にはいくつかの内部実装類があります.
  • AbortPolicy廃棄タスク、スロー運転時異常
  • CallerRunsPolicy実行タスク
  • DisccardPolicy無視して、何も起こらないです.
  • DisccardOldest Policyは、最初にキューに入る(最後の実行)タスク
  • をキューから蹴った.
  • は、RejectedExectionHandlerインターフェースを実現し、カスタムプロセッサ
  • を提供することができる.
    1.5 Javaスレッド池ExectorService
  • Exectors.newCachedThreadPoolはキャッシュ可能なスレッドプールを作成し、スレッド長が処理の必要を超えている場合、空きスレッドを柔軟に回収でき、回収できない場合は新しいスレッドを作成する.
  • Exectors.newFixedThreadPoolは、スレッドの最大の同時数を制御し、オーバーしたスレッドはキューの中で待機します.
  • Exectors.newScheduledThreadPoolは定長線のプログラムプールを作成し、タイミングと周期的なタスクの実行をサポートします.
  • Exectors.newSingleThreadExectorは、単一ラインのプロセス化されたスレッドプールを作成します.これは唯一のワークスレッドでのみタスクを実行し、すべてのタスクが指定された順序(FIFO,LIFO,優先度)で実行されることを保証します.
  • 備考:Exectorsは一つの工場類にすぎません.そのすべての方法はThreadPoolExector、ScheduledThreadPoolExectorの二つの種類の例です.
    1.6 ExectorServiceは以下のいくつかの実行方法があります.
  • exectorService.execute;この方法は、Runnableの例を受信し、非同期的に
  • を実行する.
  • exectorService.submit(Runnable)
  • exectorService.submit
  • exector Service.invokeAny(…)
  • exector Service.invokeAll(…)
  • execute(Runnable)
    この方法は、Runnableの例を受信し、非同期的に実行する.
    executorService.execute(new Runnable() {
    public void run() {
        System.out.println("Asynchronous task");
    }
    });
    
    executorService.shutdown();
    submit(Runnable)
    submit(Runnable)とexecute(Runnable)の違いは前者がFutureオブジェクトに戻り、Futureオブジェクトに戻ることで、提出されたジョブの実行が完了したかどうかを確認できます.以下の例を見てください.
    Future future = executorService.submit(new Runnable() {
    public void run() {
        System.out.println("Asynchronous task");
    }
    });
    
    future.get();  //returns null if the task has finished correctly.
    
    submit(Callable)
    submitはsubmit(Callable)とsubmit(Runnable)と同様に、Futureオブジェクトを返すこともあるが、この他に、submit(Callable)が受信したのはCallableの実現であり、Callableインターフェースのcall(call)方法はリターン値があり、タスクの実行結果に戻ることができます.次の例を見てください.
    Future future = executorService.submit(new Callable(){
    public Object call() throws Exception {
        System.out.println("Asynchronous Callable");
        return "Callable Result";
    }
    });
    
    System.out.println("future.get() = " + future.get());
    ミッションが完了すれば、future.get()メソッドはCallableタスクの実行結果に戻ります.なお、future.get()方法はブロックされます.
    invokeAny(…)
    invokeAny(…)メソッドはCallableのセットを受信し、この方法を実行するとFutureに戻りませんが、全てのCallableタスクのうちの一つのタスクの実行結果を返します.この方法では、どのタスクの実行結果が返ってくるかは保証できません.いずれかです.
    ExecutorService executorService = Executors.newSingleThreadExecutor();
    
    SetString>> callables = new HashSetString>>();
    
    callables.add(new Callable<String>() {
    public String call() throws Exception {
        return "Task 1";
    }
    });
    callables.add(new Callable<String>() {
    public String call() throws Exception {
        return "Task 2";
    }
    });
    callables.add(new Callable<String>() {
        public String call() throws Exception {
        return "Task 3";
    }
    });
    
    String result = executorService.invokeAny(callables);
    System.out.println("result = " + result);
    executorService.shutdown();
    invokeAll(…)
    invokeAll(…)もinvokeAny(…)と同様に、Callableのセットを受信したが、前者は実行後にFutureのListに戻り、Callableごとのタスク実行後のFutureオブジェクトに対応する.
    List> futures = executorService.invokeAll(callables);
    
    for(Future future : futures){
    System.out.println("future.get = " + future.get());
    }
    
    executorService.shutdown();
    2.springBootにjavaスレッド池ExectorServiceを使用する
    2.1 springBootの使用構成
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    /**
     *       ,      Spring         ExecutorService  .
     * @author Bruce
     * @date 2017/2/22
     * 
     * update by Cliff at 2027/11/03
     */
    @Configuration
    public class ThreadPoolConfig {
    
        @Bean
        public ExecutorService getThreadPool(){
            return Executors.newFixedThreadPool();
        }
    }
    
    2.2使用
    @serviceにExectorServiceを注入して直接使うことができます.
        @Autowired
        private ExecutorService executorService;
    
    public void test(){
            executorService.execute(new Runnable() {
                public void run() {
                    System.out.println("Asynchronous task");
                }
            });
        }
    参考:https://www.cnblogs.com/dolphin0520/p/3932921.html https://www.cnblogs.com/waytobestcoder/p/5323130.html