zoukankan      html  css  js  c++  java
  • 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();
    	}
  • 相关阅读:
    jq实现简单的二级联动下拉框
    jq实现多选框及反选
    用js和css实现选项卡效果+jq(2019-10-09)
    python 创建类的实例对象
    selenium——获取元素的尺寸、文本信息、元素的属性、元素是否可见
    selenium——表单嵌套
    selenium控制浏览器
    类的应用
    零散的python知识点
    安装python2、python3
  • 原文地址:https://www.cnblogs.com/halo623/p/13725587.html
Copyright © 2011-2022 走看看