今天在使用了线程池,遇到了@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使用多线程时记得开启注解