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();
	}
原文地址:https://www.cnblogs.com/halo623/p/13725587.html