@@ -33,6 +33,12 @@ | |||
<artifactId>spring-boot-starter-test</artifactId> | |||
<scope>test</scope> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.projectlombok</groupId> | |||
<artifactId>lombok</artifactId> | |||
<optional>true</optional> | |||
</dependency> | |||
</dependencies> | |||
<build> | |||
@@ -2,7 +2,22 @@ package com.xkcoding.async; | |||
import org.springframework.boot.SpringApplication; | |||
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 | |||
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)); | |||
} | |||
} |