Java并发 CompletableFuture: 异步编程: https://segmentfault.com/a/1190000019571918
Java CompletableFuture:allOf等待所有异步线程任务结束: https://blog.csdn.net/zhangphil/article/details/80670593
项目中运用:
1.封装通用方法
package xhs.appApi.service; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.function.Supplier; import org.apache.log4j.Logger; import xhs.appApi.common.CollectionUtil; public class AsynTaskService { private static Logger logger = Logger.getLogger(AsynTaskService.class); private static ExecutorService threadPool = Executors.newFixedThreadPool(500); public static void run(Runnable runnable) { threadPool.execute(runnable); } public static <T> CompletableFuture<T> supplyAsync(Supplier<T> supplier) { return CompletableFuture.supplyAsync(() -> { try { return supplier.get(); } catch (Exception e) { logger.error("supplyAsync", e); return null; } finally { RedisService.closeRedis(); } }, threadPool); } public static CompletableFuture<Void> runAsFuture(Runnable runnable) { return CompletableFuture.runAsync(() -> { try { runnable.run(); } catch (Exception e) { logger.error("runAsFuture", e); } finally { RedisService.closeRedis(); } }, threadPool); } public static CompletableFuture<Void> runAsFuture(Runnable runnable, List<CompletableFuture<Void>> list) { CompletableFuture<Void> ret = CompletableFuture.runAsync(() -> { try { runnable.run(); } catch (Exception e) { logger.error("runAsFuture", e); } finally { RedisService.closeRedis(); } }, threadPool); list.add(ret); return ret; } @SuppressWarnings("unchecked") public static void waitFinish(List<CompletableFuture<Void>> list) { final CompletableFuture<Void> instance = new CompletableFuture<Void>(); final Class<CompletableFuture<Void>> cls = (Class<CompletableFuture<Void>>) instance.getClass(); if (list==null || list.isEmpty()) return; CompletableFuture.allOf(CollectionUtil.toArray(list, cls)).join(); } }
2.应用实例(敏感词验证)
private boolean containSensitiveWords(boolean isRegisterUser, long tempDataId) { List<Integer> listCount = new ArrayList<>(); List<CompletableFuture<Void>> futures = new ArrayList<>(); if (isRegisterUser) { AsynTaskService.runAsFuture(() -> { int count = commonMapper.containSensitiveWords3(tempDataId); if (count>0) listCount.add(count); }, futures); } AsynTaskService.runAsFuture(() -> { int count = commonMapper.containSensitiveWords1(tempDataId); if (count>0) listCount.add(count); }, futures); AsynTaskService.runAsFuture(() -> { int count = commonMapper.containSensitiveWords2(tempDataId); if (count>0) listCount.add(count); }, futures); AsynTaskService.waitFinish(futures); return !listCount.isEmpty(); }