SpringBootスレッドプールを使用します

最初のステップは、スレッドプールを設定します

package com.kyy.springboot.pool;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.ThreadPoolExecutor;

/**
 * Auth: zhouhongliang
 * Date:2019/8/1
 */
@Configuration
public class GlobalConfig {
    @Bean
    public ThreadPoolTaskExecutor defaultThreadPool(){
        ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
        //核心线程数量
        threadPoolTaskExecutor.setCorePoolSize(2);
        //最大线程数量
        threadPoolTaskExecutor.setMaxPoolSize(5);
        //队列中最大任务数
        threadPoolTaskExecutor.setQueueCapacity(2);
        //线程名称前缀
        threadPoolTaskExecutor.setThreadNamePrefix("ThreadPool-");
        //当达到最大线程数时如何处理新任务
        threadPoolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        //线程空闲后最大存活时间
        threadPoolTaskExecutor.setKeepAliveSeconds(60);
        //初始化线程池
        threadPoolTaskExecutor.initialize();
        return threadPoolTaskExecutor;
    }
}

次に、サービスを作成します

package com.kyy.springboot.service;

import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

/**
 * Auth: zhouhongliang
 * Date:2019/8/1
 */
@Service
public class BootService {
    @Resource(name = "defaultThreadPool")
    private ThreadPoolTaskExecutor poolTaskExecutor;

    @Async
    public void testPool() {
        System.out.println("线程名称:" + Thread.currentThread().getName());
    }

    public void testNoPool() {
        System.out.println("线程名称:" + Thread.currentThread().getName());
    }

    public int testPoolTaskExecutor(int n) throws InterruptedException, ExecutionException {
        CountDownLatch countDownLatch = new CountDownLatch(n);
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        int sum = 0;
        for (int i = 1; i <= n; i++) {
            final int index = i;
            final Future<Integer> future = poolTaskExecutor.submit(() -> {
                Thread.sleep(5000);
                System.out.println(simpleDateFormat.format(new Date())+" "+Thread.currentThread().getName() + " 执行 " + index);
                countDownLatch.countDown();
                return 1;
            });
        }
        countDownLatch.await();
        return sum;
    }
}

ステップ3:コントローラを作成します。

package com.kyy.springboot.controller;

import com.kyy.springboot.service.BootService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.ExecutionException;

/**
 * Auth: zhouhongliang
 * Date:2019/8/1
 */
@RestController
public class PoolController {
    @Autowired
    private BootService bootService;
    @RequestMapping("/pool")
    public String pool(){
        for (int i=0;i<100;i++){
            bootService.testPool();
        }
        return "pool test";
    }
    @RequestMapping("/poolTask/{n}")
    public String poolTask(@PathVariable int n){
        long startTime = System.currentTimeMillis();
        try {
            bootService.testPoolTaskExecutor(n);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        long endTime = System.currentTimeMillis();
        return "poolTask test "+(endTime-startTime)/1000+" 秒";
    }
}

ステップ4:起動クラスを作成します。

package com.kyy.springboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;

/**
 * 启动程序
 * @Auther:zhouhongliang
 * @Date:2019/7/30
 * @Description:
 */
@SpringBootApplication
@EnableAsync
public class SpringBootDemo {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootDemo.class,args);
    }
}

概要:スレッドプールの設定手順
1、[プロパティフィールド説明

corePoolSize:スレッドの最小数を維持するために、スレッドプール

keepAliveSeconds:許さ自由時間

maxPoolSize:スレッドの最大数を維持するために、スレッドプール

queueCapacity:バッファキュー

RejectedExecutionHandler:拒否タスクの治療戦略

2、(Runable)メソッドの実行が実行
この時点で、プール内のスレッドの数がcorePoolSizeよりも小さい場合は、プール内のスレッドがアイドル状態であっても、ほかのタスクが追加された処理する新しいスレッドを作成します。

この時点でプールcorePoolSize内のスレッドの数に等しいが、ワークキューバッファのキューが満杯でない場合、タスクは、バッファ・キューに置かれます。

この時間は、プール内のスレッドcorePoolSizeの数よりも大きい場合、ワークキューバッファキューがいっぱいになると、プール内のスレッドの数がmaxPoolSize未満である、タスクが追加された処理するために、新しいスレッドを構築します。

この時間は、プール内のスレッドcorePoolSizeの数よりも大きい場合、ワークキューのバッファ・キューがいっぱいになって、プール内のスレッドの数がmaxPoolSizeに等しい場合、タスクハンドラポリシーを指定することによって処理されます。それは次のとおりです。優先処理タスクは次のとおりです。コアスレッドcorePoolSize、タスクキューのワークキュー、最大スレッドmaximumPoolSize、3つのすべてがいっぱいであれば、使用ハンドラ処理タスクが拒否されました。

プール内のスレッドの数がcorePoolSizeよりも大きい場合に、アイドル時間がスレッドkeepAliveTimeがを超えた場合、スレッドが終了します。このように、スレッドプールを動的にプール内のスレッドの数を調整することができます。

おすすめ

転載: blog.51cto.com/11147669/2425799