Java并发-CompletableFuture: 异步编程
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();
}

浙公网安备 33010602011771号