AsyncExampleService { @Deprecated @Async @Transactional public CompletableFuture<String> fakeAsyncTask() throws InterruptedException { doTaskOne(); doTaskTwo(); doTaskThree(); return CompletableFuture.completedFuture("包装在另外一个方法中，变成了单线程，只能直接调用异步方法。"); }  @Deprecated // 此种方式不行 @Async @Transactional CompletableFuture<String> fakeAsyncTask(); @Async @Transactional // 通过@Async注解表明该方法是个异步方法，如果注解在类级别，则表明该类所有的方法都是异步方法。 // 而这里的方法自动被注入使用 ThreadPoolTaskExecutor 作为 TaskExecutor // 方法的返回值可以是任意数据，通过 CompletableFuture.get() 获得。 CompletableFuture<String> doTaskOne(); @Async @Transactional CompletableFuture<String> doTaskTwo(); @Async @Transactional CompletableFuture<String> doTaskThree(); static Random random; }
@Test public void executeAsyncTask2() throws Exception { long start = System.currentTimeMillis(); CompletableFuture<String> taskAll = task.fakeAsyncTask(); CompletableFuture.allOf(taskAll).join(); long end = System.currentTimeMillis(); System.out.println("任务全部完成，总耗时：" + (end - start) / 1000 + "秒"); }