Java异步、线程池解决方案
一、ThreadPoolExecutor------线程池
private static final ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(30, 30, 30, TimeUnit.SECONDS, new LinkedBlockingQueue<>(60), new ThreadPoolExecutor.AbortPolicy());
static {
threadPoolExecutor.allowCoreThreadTimeOut(true);
}
System.out.println("======start=======");
threadPoolExecutor.execute(() -> {
System.out.println("=============");
});
System.out.println("=========end========");
//异步执行操作
参考资料:https://blog.csdn.net/qq_25806863/article/details/71126867
二、CompletableFuture----获取结果
CompletableFuture<Integer> result = CompletableFuture.supplyAsync(() -> {C
System.out.println("==========2=========");
return 1;
});
CompletableFuture<Integer> res = CompletableFuture.supplyAsync(() -> {
return 2;
});
Integer x = result.get();
Integer y = res.get();
三、异步工具类
public interface AsyncToolCommon {
/**
* 异步执行一个无参无返回值的方法
* @param voidFunction
* @throws Exception
*/
void asyncFunction(VoidFunction voidFunction);
/**
* 异步执行一个无参有返回值的方法
* @param supplier
*/
<T> void asyncSupplier(Supplier<T> supplier);
}
@Service
public class AsyncToolCommonImpl implements AsyncToolCommon {
private static final Logger logger = LoggerFactory.getLogger(AsyncToolCommonImpl.class); private static final ForkJoinPool forkJoinPool = new ForkJoinPool(2 * Runtime.getRuntime().availableProcessors() + 1); /**
* 异步执行一个无参无返回值的方法
*
* @param voidFunction
* @throws Exception
*/
@Override
public void asyncFunction(VoidFunction voidFunction) {
CompletableFuture.supplyAsync(() -> {
try {
voidFunction.execute();
return ResultEnum.SUCCESS.getCode();
} catch (Exception e) {
logger.error("asyncExecute error:{}", e);
throw new RuntimeException(e);
}
}, forkJoinPool);
} /**
* 异步执行一个无参有返回值的方法
*
* @param supplier
*/
@Override
public <T> void asyncSupplier(Supplier<T> supplier) {
CompletableFuture.supplyAsync(() -> supplier.get(), forkJoinPool);
} }
@FunctionalInterface
public interface VoidFunction {
/**
* 无参构造体
*/
void execute() throws Exception;
}
asyncToolCommon.asyncFunction(() -> .....);
四、循环调用
List<CompletableFuture<Integer>> futureList = Lists.newArrayList();
for(int i=0;i<10;i++){
futureList.add(CompletableFuture.supplyAsync(() -> {C
System.out.println("==========2=========");
return 1;
});)
}
int count = 0;
for (CompletableFuture<Integer> future : futureList) {
Integer i = future.get(600, TimeUnit.MILLISECONDS);
count += i;
}
五、Fork/Join
//线程池
private ForkJoinPool facePlatFormForkJoinPool = new ForkJoinPool(20);
private ForkJoinPool faceInfoForkJoinPool = new ForkJoinPool(20);
Callable<SearchResultJson> facePlatformCallable = () -> faceService.search(img, searchReq.getClientName(), searchReq.getClientIp(), finalAppSecret, finalToken);
//回调执行结果
Future<SearchResultJson> facePlatFormFuture =facePlatFormForkJoinPool.submit(facePlatformCallable);
SearchResultJson facePlatFormResp = facePlatFormFuture.get(6000, TimeUnit.MILLISECONDS); Callable<Response<FaceInfoResult>> faceInfoCallable = () -> faceJsfService.getFaceInfo(faceInfoParam);
Future<Response<FaceInfoResult>> faceInfoFuture = faceInfoForkJoinPool.submit(faceInfoCallable);
Response<FaceInfoResult> faceInfoResp = faceInfoFuture.get(6000, TimeUnit.MILLISECONDS);
Java异步、线程池解决方案的更多相关文章
- java异步线程池同时请求多个接口数据
一.主要使用类 . ExecutorService java线程池类 申明方式:ExecutorService exc = Executors.newFixedThreadPool(requestPa ...
- 沉淀再出发:java中线程池解析
沉淀再出发:java中线程池解析 一.前言 在多线程执行的环境之中,如果线程执行的时间短但是启动的线程又非常多,线程运转的时间基本上浪费在了创建和销毁上面,因此有没有一种方式能够让一个线程执行完自己的 ...
- Java进阶——— 线程池的原理分析
前言 在了解线程池之前,其实首先出现的疑问是:为什么要使用线程池,其次是了解什么是线程池,最后是如何使用线程池,带着疑问去学习. 为什么要使用 前面多线程文章中,需要使用线程就开启一个新线程,简单方便 ...
- spring动态线程池(实质还是用了java的线程池)
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- Spring Boot系列二 Spring @Async异步线程池用法总结
1. TaskExecutor Spring异步线程池的接口类,其实质是java.util.concurrent.Executor Spring 已经实现的异常线程池: 1. SimpleAsyncT ...
- spring boot:使用async异步线程池发送注册邮件(spring boot 2.3.1)
一,为什么要使用async异步线程池? 1,在生产环境中,有一些需要延时处理的业务场景: 例如:发送电子邮件, 给手机发短信验证码 大数据量的查询统计 远程抓取数据等 这些场景占用时间较长,而用户又没 ...
- SpringBoot使用异步线程池实现生产环境批量数据推送
前言 SpringBoot使用异步线程池: 1.编写线程池配置类,自定义一个线程池: 2.定义一个异步服务: 3.使用@Async注解指向定义的线程池: 这里以我工作中使用过的一个案例来做描述,我所在 ...
- 深入理解Java之线程池
原作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本文归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则 ...
- Java中线程池的学习
线程池的基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理.当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程 ...
- java利用线程池处理集合
java利用线程池处理集合 2018年07月23日 17:21:19 衍夏成歌 阅读数:866 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/s ...
随机推荐
- 4月27号开学! 第6期《jmeter实战接口自动化+性能》课程,零基础也能学
2019年 第6期<jmeter实战接口自动化+性能>课程,4月27号开学! 主讲老师:飞天小子 上课方式:QQ群视频在线教学 本期上课时间:4月27号-6月9号,每周六.周日晚上20:0 ...
- 牛客练习赛35 C.函数的魔法
链接 [https://ac.nowcoder.com/acm/contest/32] 题意 题目描述 一位客人来到了此花亭,给了女服务员柚一个数学问题:我们有两个函数,F(X)函数可以让X变成(XX ...
- iOS-响应链(Responder Chain)
2017.05.08 20:40* 字数 1306 阅读 740评论 6喜欢 9 工作接近一年,很久没有更新博客.工作中学到很多知识点后面将花时间整理,作为对一年知识学习的总结: 下面是本篇博客的写作 ...
- 使用redis限制ip访问次数
策略1: 在redis中保存一个count值(int),key为user:$ip,value为该ip访问的次数,第一次设置key的时候,设置expires. count加1之前,判断是否key是否存在 ...
- selenium模拟登陆淘宝
from selenium import webdriver import time from selenium.webdriver.common.by import By from selenium ...
- Tomcat异常及解决办法——持续更新中
公司项目,开发语言为java,中间件为Tomcat,运行过程中,从Tomcat出现了一些异常,现将异常及解决办法记录如下,仅供参考.(不断在补充中.......) 异常一: 1.日志内容 org.ap ...
- [转帖]SAP一句话入门:Project System
SAP一句话入门:Project System http://blog.vsharing.com/MilesForce/A621279.html 这是SAP ERP入门的最后一篇了. 我们这些死跑龙套 ...
- K3CLOUD常用数据表
一.数据库查询常用表 --查询数据表select * from ( select convert(varchar(4000),t1.FKERNELXML.query('//TableName')) a ...
- Mysql如何快速插入100万条记录?
1.java程序拼接insert带多个value,使一次提交多个值. 2.插入数据之前先删除索引(注意主键不能删除),然后插入数据,最后重建索引 3.可以设置手动commit,用来提高效率 4.使用批 ...
- Golang的聊天服务器实践(群聊,广播)(一)
其实从上学开始就一直想写一个im. 最近深入go,真是学会了太多,感觉人森虽然苦短,但是也不能只用python.很多知识是不用编译型语言无法了解的. 该来的还是会来,现在会一步一步用go把这个服务器完 ...