| @@ -33,6 +33,12 @@ | |||||
| <artifactId>spring-boot-starter-test</artifactId> | <artifactId>spring-boot-starter-test</artifactId> | ||||
| <scope>test</scope> | <scope>test</scope> | ||||
| </dependency> | </dependency> | ||||
| <dependency> | |||||
| <groupId>org.projectlombok</groupId> | |||||
| <artifactId>lombok</artifactId> | |||||
| <optional>true</optional> | |||||
| </dependency> | |||||
| </dependencies> | </dependencies> | ||||
| <build> | <build> | ||||
| @@ -2,7 +2,22 @@ package com.xkcoding.async; | |||||
| import org.springframework.boot.SpringApplication; | import org.springframework.boot.SpringApplication; | ||||
| import org.springframework.boot.autoconfigure.SpringBootApplication; | import org.springframework.boot.autoconfigure.SpringBootApplication; | ||||
| import org.springframework.scheduling.annotation.EnableAsync; | |||||
| /** | |||||
| * <p> | |||||
| * 启动器 | |||||
| * </p> | |||||
| * | |||||
| * @package: com.xkcoding.async | |||||
| * @description: 启动器 | |||||
| * @author: yangkai.shen | |||||
| * @date: Created in 2018-12-29 10:28 | |||||
| * @copyright: Copyright (c) 2018 | |||||
| * @version: V1.0 | |||||
| * @modified: yangkai.shen | |||||
| */ | |||||
| @EnableAsync | |||||
| @SpringBootApplication | @SpringBootApplication | ||||
| public class SpringBootDemoAsyncApplication { | public class SpringBootDemoAsyncApplication { | ||||
| @@ -0,0 +1,81 @@ | |||||
| package com.xkcoding.async.task; | |||||
| import lombok.extern.slf4j.Slf4j; | |||||
| import org.springframework.scheduling.annotation.Async; | |||||
| import org.springframework.scheduling.annotation.AsyncResult; | |||||
| import org.springframework.stereotype.Component; | |||||
| import java.util.concurrent.Future; | |||||
| import java.util.concurrent.TimeUnit; | |||||
| /** | |||||
| * <p> | |||||
| * 任务工厂 | |||||
| * </p> | |||||
| * | |||||
| * @package: com.xkcoding.async.task | |||||
| * @description: 任务工厂 | |||||
| * @author: yangkai.shen | |||||
| * @date: Created in 2018-12-29 10:37 | |||||
| * @copyright: Copyright (c) 2018 | |||||
| * @version: V1.0 | |||||
| * @modified: yangkai.shen | |||||
| */ | |||||
| @Component | |||||
| @Slf4j | |||||
| public class TaskFactory { | |||||
| /** | |||||
| * 模拟5秒的异步任务 | |||||
| */ | |||||
| @Async | |||||
| public Future<Boolean> asyncTask1() throws InterruptedException { | |||||
| doTask("asyncTask1", 5); | |||||
| return new AsyncResult<>(Boolean.TRUE); | |||||
| } | |||||
| /** | |||||
| * 模拟2秒的异步任务 | |||||
| */ | |||||
| @Async | |||||
| public Future<Boolean> asyncTask2() throws InterruptedException { | |||||
| doTask("asyncTask2", 2); | |||||
| return new AsyncResult<>(Boolean.TRUE); | |||||
| } | |||||
| /** | |||||
| * 模拟3秒的异步任务 | |||||
| */ | |||||
| @Async | |||||
| public Future<Boolean> asyncTask3() throws InterruptedException { | |||||
| doTask("asyncTask3", 3); | |||||
| return new AsyncResult<>(Boolean.TRUE); | |||||
| } | |||||
| /** | |||||
| * 模拟5秒的同步任务 | |||||
| */ | |||||
| public void task1() throws InterruptedException { | |||||
| doTask("task1", 5); | |||||
| } | |||||
| /** | |||||
| * 模拟2秒的同步任务 | |||||
| */ | |||||
| public void task2() throws InterruptedException { | |||||
| doTask("task2", 2); | |||||
| } | |||||
| /** | |||||
| * 模拟3秒的同步任务 | |||||
| */ | |||||
| public void task3() throws InterruptedException { | |||||
| doTask("task3", 3); | |||||
| } | |||||
| private void doTask(String taskName, Integer time) throws InterruptedException { | |||||
| log.info("{}开始执行,当前线程名称【{}】", taskName, Thread.currentThread().getName()); | |||||
| TimeUnit.SECONDS.sleep(time); | |||||
| log.info("{}执行成功,当前线程名称【{}】", taskName, Thread.currentThread().getName()); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,16 @@ | |||||
| spring: | |||||
| task: | |||||
| execution: | |||||
| pool: | |||||
| # 最大线程数 | |||||
| max-size: 16 | |||||
| # 核心线程数 | |||||
| core-size: 16 | |||||
| # 存活时间 | |||||
| keep-alive: 10s | |||||
| # 队列大小 | |||||
| queue-capacity: 100 | |||||
| # 是否允许核心线程超时 | |||||
| allow-core-thread-timeout: true | |||||
| # 线程名称前缀 | |||||
| thread-name-prefix: async-task- | |||||
| @@ -0,0 +1,61 @@ | |||||
| package com.xkcoding.async.task; | |||||
| import com.xkcoding.async.SpringBootDemoAsyncApplicationTests; | |||||
| import lombok.extern.slf4j.Slf4j; | |||||
| import org.junit.Test; | |||||
| import org.springframework.beans.factory.annotation.Autowired; | |||||
| import java.util.concurrent.ExecutionException; | |||||
| import java.util.concurrent.Future; | |||||
| /** | |||||
| * <p> | |||||
| * 测试任务 | |||||
| * </p> | |||||
| * | |||||
| * @package: com.xkcoding.async.task | |||||
| * @description: 测试任务 | |||||
| * @author: yangkai.shen | |||||
| * @date: Created in 2018-12-29 10:49 | |||||
| * @copyright: Copyright (c) 2018 | |||||
| * @version: V1.0 | |||||
| * @modified: yangkai.shen | |||||
| */ | |||||
| @Slf4j | |||||
| public class TaskFactoryTest extends SpringBootDemoAsyncApplicationTests { | |||||
| @Autowired | |||||
| private TaskFactory task; | |||||
| /** | |||||
| * 测试异步任务 | |||||
| */ | |||||
| @Test | |||||
| public void asyncTaskTest() throws InterruptedException, ExecutionException { | |||||
| long start = System.currentTimeMillis(); | |||||
| Future<Boolean> asyncTask1 = task.asyncTask1(); | |||||
| Future<Boolean> asyncTask2 = task.asyncTask2(); | |||||
| Future<Boolean> asyncTask3 = task.asyncTask3(); | |||||
| // 调用 get() 阻塞主线程 | |||||
| asyncTask1.get(); | |||||
| asyncTask2.get(); | |||||
| asyncTask3.get(); | |||||
| long end = System.currentTimeMillis(); | |||||
| log.info("异步任务全部执行结束,总耗时:{} 毫秒", (end - start)); | |||||
| } | |||||
| /** | |||||
| * 测试同步任务 | |||||
| */ | |||||
| @Test | |||||
| public void taskTest() throws InterruptedException { | |||||
| long start = System.currentTimeMillis(); | |||||
| task.task1(); | |||||
| task.task2(); | |||||
| task.task3(); | |||||
| long end = System.currentTimeMillis(); | |||||
| log.info("同步任务全部执行结束,总耗时:{} 毫秒", (end - start)); | |||||
| } | |||||
| } | |||||