diff --git a/Chapter4-1-5/pom.xml b/Chapter4-1-5/pom.xml
new file mode 100644
index 0000000..524627d
--- /dev/null
+++ b/Chapter4-1-5/pom.xml
@@ -0,0 +1,56 @@
+
+
+ 4.0.0
+
+ com.didispace
+ Chapter4-1-5
+ 1.0.0
+ jar
+
+ Chapter4-1-5
+ Spring Boot project
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 1.5.10.RELEASE
+
+
+
+
+ UTF-8
+ 1.8
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+ org.projectlombok
+ lombok
+ 1.16.20
+ provided
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
\ No newline at end of file
diff --git a/Chapter4-1-5/src/main/java/com/didispace/Application.java b/Chapter4-1-5/src/main/java/com/didispace/Application.java
new file mode 100644
index 0000000..84d84ef
--- /dev/null
+++ b/Chapter4-1-5/src/main/java/com/didispace/Application.java
@@ -0,0 +1,38 @@
+package com.didispace;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.ThreadPoolExecutor;
+
+
+@SpringBootApplication
+public class Application {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class, args);
+ }
+
+ @EnableAsync
+ @Configuration
+ class TaskPoolConfig {
+
+ @Bean("taskExecutor")
+ public Executor taskExecutor() {
+ ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+ executor.setCorePoolSize(10);
+ executor.setMaxPoolSize(20);
+ executor.setQueueCapacity(200);
+ executor.setKeepAliveSeconds(60);
+ executor.setThreadNamePrefix("taskExecutor-");
+ executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
+ return executor;
+ }
+ }
+
+}
diff --git a/Chapter4-1-5/src/main/java/com/didispace/async/Task.java b/Chapter4-1-5/src/main/java/com/didispace/async/Task.java
new file mode 100644
index 0000000..49f5f7e
--- /dev/null
+++ b/Chapter4-1-5/src/main/java/com/didispace/async/Task.java
@@ -0,0 +1,32 @@
+package com.didispace.async;
+
+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.Random;
+import java.util.concurrent.Future;
+
+/**
+ * @author 程序猿DD
+ * @version 1.0.0
+ * @date 16/5/16 下午12:58.
+ * @blog http://blog.didispace.com
+ */
+@Slf4j
+@Component
+public class Task {
+
+ public static Random random = new Random();
+
+ @Async("taskExecutor")
+ public Future run() throws Exception {
+ long sleep = random.nextInt(10000);
+ log.info("开始任务,需耗时:" + sleep + "毫秒");
+ Thread.sleep(sleep);
+ log.info("完成任务");
+ return new AsyncResult<>("test");
+ }
+
+}
diff --git a/Chapter4-1-5/src/main/resources/application.properties b/Chapter4-1-5/src/main/resources/application.properties
new file mode 100644
index 0000000..e69de29
diff --git a/Chapter4-1-5/src/test/java/com/didispace/ApplicationTests.java b/Chapter4-1-5/src/test/java/com/didispace/ApplicationTests.java
new file mode 100644
index 0000000..c9cd12f
--- /dev/null
+++ b/Chapter4-1-5/src/test/java/com/didispace/ApplicationTests.java
@@ -0,0 +1,29 @@
+package com.didispace;
+
+import com.didispace.async.Task;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+
+@Slf4j
+@RunWith(SpringJUnit4ClassRunner.class)
+@SpringBootTest
+public class ApplicationTests {
+
+ @Autowired
+ private Task task;
+
+ @Test
+ public void test() throws Exception {
+ Future futureResult = task.run();
+ String result = futureResult.get(5, TimeUnit.SECONDS);
+ log.info(result);
+ }
+
+}