Spring 默认使用的是 ThreadPoolExecutor.AbortPolicy。在Spring的默认情况下,ThreadPoolExecutor 将抛出 RejectedExecutionException 来拒绝新来的任务 ,这代表你将丢失对这个任务的处理。对于可伸缩的应用程序,建议使用 ThreadPoolExecutor.CallerRunsPolicy。当最大池被填满时,此策略为我们提供可伸缩队列。
ThreadPoolTaskExecutor 饱和策略定义:
如果当前同时运行的线程数量达到最大线程数量时,ThreadPoolTaskExecutor 定义一些策略:
ThreadPoolExecutor.AbortPolicy:抛出 RejectedExecutionException来拒绝新任务的处理。
ThreadPoolExecutor.CallerRunsPolicy:调用执行自己的线程运行任务。您不会任务请求。但是这种策略会降低对于新任务提交速度,影响程序的整体性能。另外,这个策略喜欢增加队列容量。如果您的应用程序可以承受此延迟并且你不能任务丢弃任何一个任务请求的话,你可以选择这个策略。
ThreadPoolExecutor.DiscardPolicy: 不处理新任务,直接丢弃掉。
ThreadPoolExecutor.DiscardOldestPolicy:此策略将丢弃最早的未处理的任务请求。
2. 编写一个异步的方法
下面模拟一个查找对应字符开头电影的方法,我们给这个方法加上了@Async注解来告诉 Spring 它是一个异步的方法。另外,这个方法的返回值 CompletableFuture.completedFuture(results)这代表我们需要返回结果,也就是说程序必须把任务执行完成之后再返回给用户。
请留意completableFutureTask方法中的第一行打印日志这句代码,后面分析程序中会用到,很重要!
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.scheduling.annotation.Async;
- import org.springframework.stereotype.Service;
-
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.List;
- import java.util.concurrent.CompletableFuture;
- import java.util.stream.Collectors;
-
- /** @author shuang.kou */
- @Service
- public class AsyncService {
-
- private static final Logger logger = LoggerFactory.getLogger(AsyncService.class);
-
- private List<String> movies =
- new ArrayList<>(
- Arrays.asList(
- "Forrest Gump",
- "Titanic",
- "Spirited Away",
- "The Shawshank Redemption",
- "Zootopia",
- "Farewell ",
- "Joker",
- "Crawl"));
-
- /** 示范使用:找到特定字符/字符串开头的电影 */
- @Async
- public CompletableFuture<List<String>> completableFutureTask(String start) {
- // 打印日志
- logger.warn(Thread.currentThread().getName() + "start this task!");
- // 找到特定字符/字符串开头的电影
- List<String> results =
- movies.stream().filter(movie -> movie.startsWith(start)).collect(Collectors.toList());
- // 模拟这是一个耗时的任务
- try {
- Thread.sleep(1000L);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- //返回一个已经用给定值完成的新的CompletableFuture。
- return CompletableFuture.completedFuture(results);
- }
- }
(编辑:ASP站长网)
|