Spring boot多线程配置方法

 更新时间:2017年10月30日 14:07:06   作者:瘦鱼  
这篇文章主要为大家详细介绍了Spring boot多线程配置方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Spring boot多线程配置的具体代码,供大家参考,具体内容如下

1、配置线程配置类

package test;

import java.util.concurrent.Executor;

import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

@Configuration
@ComponentScan("test")
@EnableAsync
// 线程配置类
public class AsyncTaskConfig implements AsyncConfigurer {

  // ThredPoolTaskExcutor的处理流程
  // 当池子大小小于corePoolSize,就新建线程,并处理请求
  // 当池子大小等于corePoolSize,把请求放入workQueue中,池子里的空闲线程就去workQueue中取任务并处理
  // 当workQueue放不下任务时,就新建线程入池,并处理请求,如果池子大小撑到了maximumPoolSize,就用RejectedExecutionHandler来做拒绝处理
  // 当池子的线程数大于corePoolSize时,多余的线程会等待keepAliveTime长时间,如果无请求可处理就自行销毁

  @Override
  public Executor getAsyncExecutor() {
    ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
    taskExecutor.setCorePoolSize(5);// 最小线程数
    taskExecutor.setMaxPoolSize(10);// 最大线程数
    taskExecutor.setQueueCapacity(25);// 等待队列

    taskExecutor.initialize();

    return taskExecutor;
  }

  @Override
  public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
    return null;
  }
}

2、定义线程执行任务类

package test;

import java.util.Random;
import java.util.concurrent.Future;

import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.AsyncResult;
import org.springframework.stereotype.Service;

@Service
// 线程执行任务类
public class AsyncTaskService {

  Random random = new Random();// 默认构造方法

  @Async
  // 表明是异步方法
  // 无返回值
  public void executeAsyncTask(Integer i) {
    System.out.println("执行异步任务:" + i);
  }

  /**
   * 异常调用返回Future
   * 
   * @param i
   * @return
   * @throws InterruptedException
   */
  @Async
  public Future<String> asyncInvokeReturnFuture(int i) throws InterruptedException {
    System.out.println("input is " + i);
    Thread.sleep(1000 * random.nextInt(i));

    Future<String> future = new AsyncResult<String>("success:" + i);// Future接收返回值,这里是String类型,可以指明其他类型

    return future;
  }
}

3、调用

package test;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.core.task.TaskRejectedException;

public class Application {

  public static void main(String[] args) throws InterruptedException, ExecutionException {
    // testVoid();

    testReturn();
  }

  // 测试无返回结果
  private static void testVoid() {
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AsyncTaskConfig.class);
    AsyncTaskService asyncTaskService = context.getBean(AsyncTaskService.class);

    // 创建了20个线程
    for (int i = 1; i <= 20; i++) {
      asyncTaskService.executeAsyncTask(i);
    }

    context.close();
  }

  // 测试有返回结果
  private static void testReturn() throws InterruptedException, ExecutionException {
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AsyncTaskConfig.class);
    AsyncTaskService asyncTaskService = context.getBean(AsyncTaskService.class);

    List<Future<String>> lstFuture = new ArrayList<Future<String>>();// 存放所有的线程,用于获取结果

    // 创建100个线程
    for (int i = 1; i <= 100; i++) {
      while (true) {
        try {
          // 线程池超过最大线程数时,会抛出TaskRejectedException,则等待1s,直到不抛出异常为止
          Future<String> future = asyncTaskService.asyncInvokeReturnFuture(i);
          lstFuture.add(future);

          break;
        } catch (TaskRejectedException e) {
          System.out.println("线程池满,等待1S。");
          Thread.sleep(1000);
        }
      }
    }

    // 获取值。get是阻塞式,等待当前线程完成才返回值
    for (Future<String> future : lstFuture) {
      System.out.println(future.get());
    }

    context.close();
  }
}

maven配置

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <groupId>TestAysc</groupId>
 <artifactId>TestAysc</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 <dependencies>
   <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot</artifactId>
     <version>1.5.6.RELEASE</version>
   </dependency>
   <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-aop</artifactId>
     <version>4.3.10.RELEASE</version>
   </dependency>
 </dependencies>
</project>

结果展示:

1、无返回结果

2、有返回结果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • spring-data-redis自定义实现看门狗机制

    spring-data-redis自定义实现看门狗机制

    redission看门狗机制是解决分布式锁的续约问题,本文主要介绍了spring-data-redis自定义实现看门狗机制,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • 新手了解java 集合基础知识

    新手了解java 集合基础知识

    今天小编就为大家分享一篇关于Java集合总结,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧,希望对你有所帮助
    2021-07-07
  • Java单链表基本操作的实现

    Java单链表基本操作的实现

    链表是一种数据结构,和数组同级。接下来通过本文给大家介绍Java单链表基本操作的实现,非常不错,具有参考借鉴价值,感兴趣的朋友一起看下吧
    2016-07-07
  • Nacos配置的多文件加载与共享配置方式

    Nacos配置的多文件加载与共享配置方式

    这篇文章主要介绍了Nacos配置的多文件加载与共享配置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • spring boot 使用Aop通知打印控制器请求报文和返回报文问题

    spring boot 使用Aop通知打印控制器请求报文和返回报文问题

    这篇文章主要介绍了spring-boot 使用Aop通知打印控制器请求报文和返回报文,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2018-04-04
  • Spring AOP面向切面编程实现原理方法详解

    Spring AOP面向切面编程实现原理方法详解

    这篇文章主要介绍了Spring AOP面向切面编程实现原理方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • java 中cookie的详解及简单实例

    java 中cookie的详解及简单实例

    这篇文章主要介绍了java 中cookie的详解及简单实例的相关资料,这里对cookie 的建立与读取,和设定cookie 生命周期等详细介绍,需要的朋友可以参考下
    2017-01-01
  • servlet重定向详解(八)

    servlet重定向详解(八)

    这篇文章主要为大家详细介绍了servlet重定向的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • 基于Java的Socket编写的C/S聊天程序实现

    基于Java的Socket编写的C/S聊天程序实现

    这篇文章主要介绍了基于Java的Socket编写的C/S聊天程序实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • springboot的切面应用方式(注解Aspect)

    springboot的切面应用方式(注解Aspect)

    文章总结:Spring Boot提供了三种拦截器:Filter、Interceptor和Aspect,Filter主要用于内容过滤和非登录状态的非法请求过滤,无法获取Spring框架相关的信息,Interceptor可以在获取请求类名、方法名的同时,获取请求参数,但无法获取参数值
    2024-11-11

最新评论