天天看點

springboot 線程池_springboot配置線程池-高并發場景

1. 編寫配置檔案
package com.hbedu.search.hbsearch.utils;
 
import org.slf4j.Logger;
 
import org.slf4j.LoggerFactory;
 
import org.springframework.context.annotation.Bean;
 
import org.springframework.context.annotation.Configuration;
 
import org.springframework.scheduling.annotation.EnableAsync;
 
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 
 
 
import java.util.concurrent.Executor;
 
import java.util.concurrent.ThreadPoolExecutor;
 
 
@Configuration
 
@EnableAsync
 
public class ExecutorConfig {
 
 
 
    private static final Logger logger = LoggerFactory.getLogger(ExecutorConfig.class);
 
 
    @Bean
 
    public Executor asyncServiceExecutor() {
 
        logger.info("start asyncServiceExecutor");
 
        //ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
 
        ThreadPoolTaskExecutor executor = new VisiableThreadPoolTaskExecutor();
 
        //配置核心線程數
 
        executor.setCorePoolSize(5);
 
        //配置最大線程數
 
        executor.setMaxPoolSize(5);
 
        //配置隊列大小
 
        executor.setQueueCapacity(99999);
 
        //配置線程池中的線程的名稱字首
 
        executor.setThreadNamePrefix("async-service-");
 
        // rejection-policy:當pool已經達到max size的時候,如何處理新任務
 
        // CALLER_RUNS:不在新線程中執行任務,而是有調用者所在的線程來執行
 
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
 
        //執行初始化
 
        executor.initialize();
 
        return executor;
 
    }
 
 
}
           
2.建立接口 AsyncService
package com.hbedu.search.hbsearch.service;
 
public interface AsyncService {
 
    /**
     * 執行異步任務
     */
 
    void executeAsync();
 
}
           
3.編寫AsyncService實作
package com.hbedu.search.hbsearch.service.impl;
 
import com.hbedu.search.hbsearch.service.AsyncService;
 
import org.slf4j.Logger;
 
import org.slf4j.LoggerFactory;
 
import org.springframework.stereotype.Service;
 
 
@Service
 
public class AsyncServiceImpl implements AsyncService {
 
 
 
    private static final Logger logger = LoggerFactory.getLogger(AsyncServiceImpl.class);
 
 
 
    @Override
 
    @Async("asyncServiceExecutor")
 
    public void executeAsync() {
 
        logger.info("start executeAsync");
 
        try{
 
            Thread.sleep(1000);
 
        }catch(Exception e){
 
            e.printStackTrace();
 
        }
 
        logger.info("end executeAsync");
 
    }
 
}
           

4.編寫controller

package com.hbedu.search.hbsearch.controller;
 
 
 
import com.hbedu.search.hbsearch.service.AsyncService;
 
import org.slf4j.Logger;
 
import org.slf4j.LoggerFactory;
 
import org.springframework.beans.factory.annotation.Autowired;
 
import org.springframework.web.bind.annotation.RequestMapping;
 
import org.springframework.web.bind.annotation.RestController;
 
 
 
@RestController
 
public class ExecutorController {
 
    private static final Logger logger = LoggerFactory.getLogger(ExecutorController.class);
 
    @Autowired
 
    private AsyncService asyncService;
 
 
 
    @RequestMapping("/ececutor")
 
    public String submit(){
 
        logger.info("start submit");
 
 
        //調用service層的任務
 
        asyncService.executeAsync();
 
 
        logger.info("end submit");
 
        return "success";
 
    }
 
 
}
           
5.啟動服務調用接口檢視 快速重新整理(如果效果不明顯,請增加線程睡眠時間),目的是複現高并發場景,有環境可以進行壓力測試
springboot 線程池_springboot配置線程池-高并發場景
springboot 線程池_springboot配置線程池-高并發場景
6. 為了檢視更多線程資訊,實作VisiableThreadPoolTaskExecutor 繼承ThreadPoolTaskExecutor
package com.hbedu.search.hbsearch.utils;
 
import org.slf4j.Logger;
 
import org.slf4j.LoggerFactory;
 
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 
import org.springframework.util.concurrent.ListenableFuture;
 
 
 
import java.util.concurrent.Callable;
 
import java.util.concurrent.Future;
 
import java.util.concurrent.ThreadPoolExecutor;
 
 
public class VisiableThreadPoolTaskExecutor extends ThreadPoolTaskExecutor {
 
 
    private static final Logger logger = LoggerFactory.getLogger(VisiableThreadPoolTaskExecutor.class);
 
 
    private void showThreadPoolInfo(String prefix){
 
        ThreadPoolExecutor threadPoolExecutor = getThreadPoolExecutor();
 
 
        if(null==threadPoolExecutor){
 
            return;
 
        }
 
 
        logger.info("{}, {},taskCount [{}], completedTaskCount [{}], activeCount [{}], queueSize [{}]",
 
                this.getThreadNamePrefix(),
 
                prefix,
 
                threadPoolExecutor.getTaskCount(),
 
                threadPoolExecutor.getCompletedTaskCount(),
 
                threadPoolExecutor.getActiveCount(),
 
                threadPoolExecutor.getQueue().size());
 
    }
 
 
 
    @Override
 
    public void execute(Runnable task) {
 
        showThreadPoolInfo("1. do execute");
 
        super.execute(task);
 
    }
 
 
    @Override
 
    public void execute(Runnable task, long startTimeout) {
 
        showThreadPoolInfo("2. do execute");
 
        super.execute(task, startTimeout);
 
    }
 
 
 
    @Override
 
    public Future<?> submit(Runnable task) {
 
        showThreadPoolInfo("1. do submit");
 
        return super.submit(task);
 
    }
 
 
    @Override
 
    public <T> Future<T> submit(Callable<T> task) {
 
        showThreadPoolInfo("2. do submit");
 
        return super.submit(task);
 
    }
 
 
 
    @Override
 
    public ListenableFuture<?> submitListenable(Runnable task) {
 
        showThreadPoolInfo("1. do submitListenable");
 
        return super.submitListenable(task);
 
    }
 
 
 
    @Override
 
    public <T> ListenableFuture<T> submitListenable(Callable<T> task) {
 
        showThreadPoolInfo("2. do submitListenable");
 
        return super.submitListenable(task);
 
    }
 
}

           

個人項目 不對的地方自行更改 版本衆多自行選擇

如有不對請指出!!!!!!!!!!!!!!!!!!!!!!!!

springboot 線程池_springboot配置線程池-高并發場景