zoukankan      html  css  js  c++  java
  • SpingBoot —— 多线程

      Spring 通过任务执行器(TaskExecutor)来实现多线程和并发编程。使用ThreadPoolTaskExecutor可实现一个基于线程池的TaskExecutor。而实际开发中任务一般是非阻塞的,即异步的,所有我们在配置类中通过@EnableAsync开启对异步任务的支持,并通过在实际执行的Bean的方法中使用@Async注解来声明其是一个异步任务。

    一、配置类

    package com.cenobitor.taskxecutor.config;
    
    import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.scheduling.annotation.AsyncConfigurer;
    import org.springframework.scheduling.annotation.EnableAsync;
    import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
    import java.util.concurrent.Executor;
    
    @Configuration
    @EnableAsync
    public class TaskExecutorConfig implements AsyncConfigurer {
    
        @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;
        }
    }

    1、利用@EnableAsync注解开启异步任务支持

    2、配置类实现AsyncConfigurer接口并重写getAsyncExecutor方法,并返回一个ThreadPoolTaskExecutor,这样我们就获得了一个基于线程池TaskExecutor。

    二、任务执行类

    package com.cenobitor.taskxecutor.taskservice;
    
    import org.springframework.scheduling.annotation.Async;
    import org.springframework.stereotype.Service;
    
    @Service
    public class AsyncTaskService {
    
        @Async
        public void excuteAsyncTask(Integer i){
            System.out.println("异步执行任务:"+i);
        }
    
        @Async
        public void excuteAsyncTaskPlus(Integer i){
            System.out.println("异步执行任务+1:"+(i+1));
        }
    }

      通过@Async注解表明该方法是异步方法,如果注解在类级别,则表明该类所有的方法都是异步方法,而这里的方法自动被注入使用ThreadPoolTaskExecutor作为TaskExecutor。

      如果在异步方法所在类中调用异步方法,将会失效;

    三、运行

    package com.cenobitor.taskxecutor;
    
    import com.cenobitor.taskxecutor.taskservice.AsyncTaskService;
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    
    public class Main {
        public static void main(String[] args) {
            AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(TaskxecutorApplication.class);
            AsyncTaskService asyncTaskService = context.getBean(AsyncTaskService.class);
            for (int i = 0; i < 10; i++) {
                asyncTaskService.excuteAsyncTask(i);
                asyncTaskService.excuteAsyncTaskPlus(i);
            }
            context.close();
        }
    
    }

    运行结果:

    异步执行任务:0
    异步执行任务+1:1
    异步执行任务:1
    异步执行任务+1:2
    异步执行任务:2
    异步执行任务:3
    异步执行任务:5
    异步执行任务+1:6
    异步执行任务:6
    异步执行任务+1:7
    异步执行任务:7
    异步执行任务+1:8
    异步执行任务:8
    异步执行任务+1:9
    异步执行任务:9
    异步执行任务+1:10
    异步执行任务+1:3
    异步执行任务:4
    异步执行任务+1:5
    异步执行任务+1:4

      注:摘抄自《JavaEE开发的颠覆者SpringBoot 实战》。

  • 相关阅读:
    1058 A+B in Hogwarts (20)
    1036. Boys vs Girls (25)
    1035 Password (20)
    1027 Colors in Mars (20)
    1009. Product of Polynomials (25)
    1006. Sign In and Sign Out
    1005 Spell It Right (20)
    1046 Shortest Distance (20)
    ViewPager页面滑动,滑动到最后一页,再往后滑动则执行一个事件
    IIS7.0上传文件限制的解决方法
  • 原文地址:https://www.cnblogs.com/gdwkong/p/9311047.html
Copyright © 2011-2022 走看看