使用@Async注解异步执行

x33g5p2x  于2022-07-06 转载在 其他  
字(2.7k)|赞(0)|评价(0)|浏览(395)

同步执行

先看一下同步执行时的效果

代码示例

@Component
public class CommonExecutor {

    public void doTaskOne() {
        doTask("One");
    }

    public void doTaskTwo() {
        doTask("Two");
    }

    public void doTaskThree() {
        doTask("Three");
    }

    private void doTask(String name) {
        System.out.println("执行任务-" + name + " thread:" + Thread.currentThread().getName());
        StopWatch stopwatch = new StopWatch("任务" + name);
        stopwatch.start();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        stopwatch.stop();
        System.out.println("任务-" + name + " 耗时(ms):" + stopwatch.getTotalTimeMillis());
    }

}

测试类

@SpringBootTest
public class CommonTest {

    @Autowired
    private CommonExecutor commonExecutor;
    @Test
    public void testExecutor(){
        StopWatch stopwatch = new StopWatch("同步执行");
        stopwatch.start();
        commonExecutor.doTaskOne();
        commonExecutor.doTaskTwo();
        commonExecutor.doTaskThree();
        stopwatch.stop();
        System.out.println("同步执行 总耗时(ms):" + stopwatch.getTotalTimeMillis());

    }

}

测试结果

异步执行

再来看一下使用异步优化后的执行效果

代码示例

@Component
public class CommonExecutorAsync {

    // 用指定的线程池
    @Async("testExecutor")
    public CompletableFuture<String> doTaskOne() {
        return doTask("One");
    }

    @Async("testExecutor")
    public CompletableFuture<String> doTaskTwo() {
        return doTask("Two");
    }

    @Async("testExecutor")
    public CompletableFuture<String> doTaskThree() {
        return doTask("Three");
    }

    private CompletableFuture<String> doTask(String name) {
        System.out.println("执行任务-" + name + " thread:" + Thread.currentThread().getName());
        StopWatch stopwatch = new StopWatch("任务" + name);
        stopwatch.start();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        stopwatch.stop();
        System.out.println("任务-" + name + " 耗时(ms):" + stopwatch.getTotalTimeMillis());
        return CompletableFuture.completedFuture("任务" + name + "完成");
    }

}

定义线程池

@Configuration
public class ExecutorThreadPool {
    @Bean("testExecutor")
    public ExecutorService executorService() {
        return new ThreadPoolExecutor(1, 5, 5, TimeUnit.SECONDS,
                new SynchronousQueue<>(), new ThreadFactoryBuilder().setNameFormat("testExecutor-%d").build());
    }
}

测试类

@EnableAsync //允许开启异步的注解
@SpringBootTest
public class CommonTest {
    @Autowired
    private CommonExecutorAsync commonExecutorAsync;

    @Test
    public void testExecutorAsync(){
        StopWatch stopwatch = new StopWatch("异步执行");
        stopwatch.start();
        CompletableFuture<String> aFuture = commonExecutorAsync.doTaskOne();
        CompletableFuture<String> bFuture = commonExecutorAsync.doTaskTwo();
        CompletableFuture<String> cFuture = commonExecutorAsync.doTaskThree();
        CompletableFuture.allOf(aFuture,bFuture,cFuture).join();
        stopwatch.stop();
        System.out.println("异步执行 总耗时(ms):" + stopwatch.getTotalTimeMillis());

    }

}

测试结果

相关文章