Springboot使用多线程,线程池

  |   0 评论   |   155 浏览

    springboot使用多线程,线程池的方式有多种。可以用springboot自带的一种注解式的,当然也可以使用我们自己定义的多线程方式。
    第一种:使用springboot注解方式
    1、首先自定义一个实现AsyncConfigurer接口的类,并让其用spring容器管理起来

    @Component
    public class CustomMultiThreadingConfig implements AsyncConfigurer {
    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @Override
    public Executor getAsyncExecutor() {
    // TODO Auto-generated method stub
    ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
    taskExecutor.setCorePoolSize(5);
    taskExecutor.setMaxPoolSize(10);
    taskExecutor.setQueueCapacity(25);
    taskExecutor.initialize();
    return taskExecutor;
    }

    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
    // TODO Auto-generated method stub
    return new MyAsyncExceptionHandler();
    }

    /**
    * 自定义异常处理类
    */
    class MyAsyncExceptionHandler implements AsyncUncaughtExceptionHandler {
    // 手动处理捕获的异常
    @Override
    public void handleUncaughtException(Throwable throwable, Method method, Object… obj) {
    logger.info(“————-》》》捕获线程异常信息”);
    logger.info("Exception message - " + throwable.getMessage());
    logger.info("Method name - " + method.getName());
    for (Object param : obj) {
    logger.info("Parameter value - " + param);
    }
    }
    }
    }

    定义好了自定义的多线程配置类之后,其中同时定义了线程池容器。该线程池用ThreadPoolTaskExecutor实现,并设置核心的一些参数。可以根据自己的配置以及应用场景进行适当的调整。

    2、打开springboot支持多线程异步的开关@EnableAsync。这个可以在入口函数出添加这个注解
    @EnableAsync // 开启springboot异步开关
    @SpringBootApplication
    public class App {
    private static Logger logger = LoggerFactory.getLogger(App.class);
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    SpringApplication.run(App.class, args);
    logger.info(“start ok”);
    }
    }

    3、前置工作都准备好了之后,后续需要使用该异步编程,在方法上面加上@Async注解
    @Async
    public void test() {
    for(int i = 0; i < 10; i++) {
    try {
    Thread.sleep(1000);
    System.out.println(“========== test ========”);
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }
    这样子就可以使用springboot中的线程池异步执行test()方法。

    第二种,自定义线程池进行调度:
    //定义线程池
    ExecutorService executor = Executors.newFixedThreadPool(10);
    CompletableFuture.supplyAsync(()->function(), executor);
    这种方式比较简单。主要创建executor线程池,然后使用CompletableFuture的方式进行任务的提交。
    结果的获取方式:
    比如Future res = CompletableFuture.supplyAsync(()->function(), executor);
    T t = res.get();

    评论

    发表评论

    validate