赞
踩
SpringBoot + 线程池 使用
- @Configurable
-
- @EnableAsync //开启线程池,应用启动时开启
-
- public class ThreadPoolConfig {
-
- @Bean("taskExecutor")
-
- public Executor asyncServiceExecutor(){
-
- ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
-
- //设置核心线程数:线程池创建时初始化的线程数
-
- executor.setCorePoolSize(5);
-
- //设置最大线程数:只有在缓冲队列满了之后才会申请超过核心线程数的线程
-
- executor.setMaxPoolSize(20);
-
- //配置队列大小:用来缓冲执行任务的队列
-
- executor.setQueueCapacity(500);
-
- //设置线程空闲时间(秒):当超过了核心线程之外的线程在空闲时间达到后会被销毁
-
- executor.setKeepAliveSeconds(60);
-
- //设置线程池的前缀:方便我们定位处理任务所在的线程池
-
- executor.setThreadNamePrefix("thread-pool-task");
-
- //缓冲队列满了之后的拒绝策略:由 调用线程处理(一般是主线程)
-
- executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy());
-
- //等待所有任务结束后再关闭线程池
-
- executor.setWaitForTasksToCompleteOnShutdown(true);
-
- //执行初始化
-
- executor.initialize();
-
- return executor;
-
- }
-
- }
- @Component
-
- @Slf4j
-
- public class ThreadService {
-
- //期望此操作在线程池执行 不会影响原有的主线程
-
- @Async("taskExecutor")
-
- public void updateXXX(LotteryCalculatePerMapper lotteryCalculatePerMapper,Long id){
-
- try{
-
- Thread.sleep(1000);
-
- lotteryCalculatePerMapper.getById(id);
-
- }catch (Exception e){
-
- log.error(e.getMessage());
-
- }
-
- }
-
- }
- @EnableAsync // 启用异步
-
- @EnableCaching // 启用缓存
-
- @EnableScheduling // 启动定时任务
-
- @SpringBootApplication // springboot本尊
-
- @EnableTransactionManagement // 启动注解事务管理
-
- @Slf4j
-
- public class SpServerApplication {
-
- public static void main(String[] args) {
-
- //可通过上线文找到SpringBoot默认注册的线程池及其情况
-
- ConfigurableApplicationContext context = SpringApplication.run(SpServerApplication.class, args);
-
- ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
-
- ThreadPoolTaskExecutor applicationTaskExecutor = (ThreadPoolTaskExecutor)beanFactory.getSingleton("applicationTaskExecutor");
-
- //默认的核心线程数:8,最大线程数:2147483647,激活数:0,空闲时间:60,队列使用LinkedBlockingQueue,线程池拒绝策略:AbortPolicy
-
- log.info("默认的核心线程数:{},最大线程数:{},激活数:{},空闲线程保留时间:{}",
-
- applicationTaskExecutor.getCorePoolSize(),applicationTaskExecutor.getMaxPoolSize()
-
- ,applicationTaskExecutor.getActiveCount(),applicationTaskExecutor.getKeepAliveSeconds());
-
- }
-
- }
- CompletableFuture<Void> voidCompletableFuture = CompletableFuture.runAsync(() -> {
-
- lotteryCalculatePerService.lotteryCalculatePer();
-
- }, threadPoolTaskExecutor);
-
- CompletableFuture<Void> voidCompletableFuture1 = CompletableFuture.runAsync(() -> {
-
- lotteryCalculateCountService.lotteryCalculateCount();
-
- }, threadPoolTaskExecutor);
-
- CompletableFuture<Void> voidCompletableFuture2 = CompletableFuture.runAsync(() -> {
-
- lotteryCalculateNineService.lotteryCalculateNine();
-
- }, threadPoolTaskExecutor);
-
- //等待所有完成
-
- try {
-
- CompletableFuture.allOf(voidCompletableFuture,voidCompletableFuture1,voidCompletableFuture2).get();
-
- } catch (InterruptedException e) {
-
- throw new RuntimeException(e);
-
- } catch (ExecutionException e) {
-
- throw new RuntimeException(e);
-
- }
- @Async("taskExecutor")
-
- @SneakyThrows
-
- public void testVoid(){
-
- Thread.sleep(1000);
-
- log.info("testVoid。。。");
-
- }
- public String syncData() throws ExecutionException, InterruptedException {
-
- CompletableFuture<Void> voidCompletableFuture = CompletableFuture.runAsync(() -> {
-
- lotteryCalculatePerService.lotteryCalculatePer();
-
- }, threadPoolTaskExecutor);
-
- CompletableFuture<Void> voidCompletableFuture1 = CompletableFuture.runAsync(() -> {
-
- lotteryCalculateCountService.lotteryCalculateCount();
-
- }, threadPoolTaskExecutor);
-
- CompletableFuture<Void> voidCompletableFuture2 = CompletableFuture.runAsync(() -> {
-
- lotteryCalculateNineService.lotteryCalculateNine();
-
- }, threadPoolTaskExecutor);
-
- //等待所有完成
-
- CompletableFuture.allOf(voidCompletableFuture,voidCompletableFuture1,voidCompletableFuture2).get();
-
- //注:以上执行为异步操作,主程序为顺序执行,CompletableFuture.allOf 起一个挡板作用,以上为异步
-
- return "OK!";
-
- }
函数式编程(Lambda)
概述
Stream流
Optional
函数式接口
方法引用
高级用法
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。