记录遇到的问题springboot使用@Async 注解不生效

今天在使用了线程池,遇到了@Async不生效的问题,具体线程池的代码如下

@Configuration
@EnableAsync
public class ExecutorConfig {
    private static Logger logger = LogManager.getLogger(ExecutorConfig.class.getName());

    @Bean
    public Executor asyncServiceExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        //配置核心线程数
        executor.setCorePoolSize(5);
        //配置最大线程数
        executor.setMaxPoolSize(10);
        //配置队列大小
        executor.setQueueCapacity(400);
        //配置线程池中的线程的名称前缀
        executor.setThreadNamePrefix("thread-");
        // rejection-policy:当pool已经达到max size的时候,如何处理新任务
        // CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        //执行初始化
        executor.initialize();
        return executor;
    }
}

一开始我将所有的任务都放在了一个方法里,具体代码如下

 @Override
    @Async("asyncServiceExecutor")
    public void writeTxt(String fileName) {


        System.out.println("线程" + Thread.currentThread().getId() + "开始执行");
        File file = new File("F://F.zip");
        File f2 = new File("F://test");
        File f3 = new File("F://test1");
        File f4 = new File("F://test2");
        long startTime = System.currentTimeMillis();   //获取开始时间
        try {

            FileUtils.copyFileToDirectory(file, f2);
            FileUtils.copyFileToDirectory(file, f3);
            FileUtils.copyFileToDirectory(file, f4);
            long endTime = System.currentTimeMillis(); //获取结束时间
            System.out.println("程序运行时间: " + (endTime - startTime) + "ms");
            System.out.println("线程" + Thread.currentThread().getId() + "执行结束");
        } catch (IOException e) {
            e.printStackTrace();
        }


    }

测试代码如下

  @Test
    public void test05() throws InterruptedException {
        //51337ms  51148ms
        //52483ms
        long start = System.currentTimeMillis();
        Future<String> task1=ayscService.writeTxt("aaa");
        while (true){
            if(task1.isDone() ) {
                break;
            }
            Thread.sleep(1000);
        }
        long end = System.currentTimeMillis();

        System.out.println("任务全部完成,总耗时:" + (end - start) + "毫秒");
}

  

但是发现从始至终都只有一个线程在跑,后来参考了其他博客才发现自己存在的问题:没有将方法拆开并且调用方也应该是其他类来调用,博客地址:

http://blog.didispace.com/springbootasync/

最后做下总结:

1.多线程用在多个可以并行执行的任务

2.使用多线程时,注意调用方要是另外的类(使用公共线程池)

3.springboot使用多线程时记得开启注解

猜你喜欢

转载自www.cnblogs.com/jiushijiang/p/12449272.html
今日推荐