线上接口经常超时,我用线程池+ FutureTask解决了,YYDS
欢迎关注方志朋的博客,回复”666“获面试宝典
之前红包权益领取查询的接口超时了,因为有用户订购的权益有点多
解决方案
用线程池+ FutureTask将1个查询拆分成多个小查询 选择FutureTask是因为它具有仅执行1次run()方法的特性(即使有多次调用也只执行1次),避免了重复查询的可能。而且多任务异步执行也能提高接口响应速度。
本文主要讲的是线程池搭配FutureTask异步执行的例子
一、线程池+FutureTask执行多任务计算
public class Test {//线程池最好作为全局变量, 若作为局部变量记得用完后shutdown()ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("thread-start-runner-%d").build();ExecutorService taskExe= new ThreadPoolExecutor(10,20,800L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>(100),namedThreadFactory);int count=0;@Testpublic void test(String[] args) {//任务列表List<FutureTask<Integer>> taskList=new ArrayList<FutureTask<Integer>>();for(int i=0;i<100;i++){//创建100个任务放入【任务列表】FutureTask<Integer> futureTask=new FutureTask<Integer>(new Callable<Integer>() {@Overridepublic Integer call() throws Exception {return 1;}});//执行的结果装回原来的FutureTask中,后续直接遍历集合taskList来获取结果即可taskList.add(futureTask);taskExe.submit(futureTask);}//获取结果try{for(FutureTask<Integer> futureTask:taskList){count+=futureTask.get();}} catch (InterruptedException e) {logger.error("线程执行被中断",e);} catch (ExecutionException e) {logger.error("线程执行出现异常",e);}//关闭线程池taskExe.shutdown();//打印: 100System.out.println(count);}
}
Callable接口能让我们拿到线程的执行结果,所以让它作为FutureTask构造函数FutureTask(Callable<V> callable)
的入参。
FutureTask执行的结果会放入它的私有变量outcome中,其他线程直接调用futureTask.get()去读取该变量即可
二、子线程出的异常抛不出的情况
submit(Runnable task)
提交任务的方式 ,是存在“隐患”的:
FutureTask内部的run()代码块会把异常给吞进去,通过setException(Throwable t)把异常赋给了对象outcome,我们在调用FutureTask.get()获取结果的时候返回的就是这个对象
如果你的代码没有调用FutureTask.get(),它不会把异常吐出来,有可能子线程就莫名的停止了。
public Future<?> submit(Runnable task) {if (task == null) throw new NullPointerException();//创建一个异步执行的任务FutureTask, 【隐患】也在它的run()代码块里RunnableFuture<Void> ftask = newTaskFor(task, null);execute(ftask);return ftask;
}
子线程创建之后会执行的是FutureTask内部的run()代码块,run()内部会有try-catch来截获抛出的异常,将其赋值给对象outcome
上面的例子没有这个问题,因为调用了FutureTask.get(),有异常会从这里拿出来
来源 | https://blog.csdn.net/qq_44384533/article/details/112324224
热门内容:
推荐一个 Java 接口快速开发框架
面试官:有了 for 循环 为什么还要 forEach ?
网传铁饭碗职业排名,公务员仅排第八!
为什么 Java 中“1000==1000”为false,而”100==100“为true?
最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。
明天见(。・ω・。)ノ♡
线上接口经常超时,我用线程池+ FutureTask解决了,YYDS相关推荐
- 接口经常超时?线程池+ FutureTask来解决!
之前红包权益领取查询的接口超时了,因为有用户订购的权益有点多 解决方案 用线程池+ FutureTask将1个查询拆分成多个小查询 选择FutureTask是因为它具有仅执行1次run()方法的特性( ...
- Java线上接口耗时分析神器 Arthas
文章目录 背景 问题 Arthas github地址 官网文档地址: 说明 安装 运行Arthas trace命令的使用 统计时间不准确问题 总结 背景 有时候我们在对线上接口作性能优化的时候需要找出 ...
- 一次线上生产问题的全面复盘 【定位-分析-解决】
来自:crossoverJie 目录: 写在前面 生产现象 定位问题 解决办法 本地模拟 内存分析 总结 写在前面 之前或多或少分享过一些内存模型.对象创建之类的内容,其实大部分人看完都是懵懵懂懂,也 ...
- future java 原理_Java线程池FutureTask实现原理详解
前言 线程池可以并发执行多个任务,有些时候,我们可能想要跟踪任务的执行结果,甚至在一定时间内,如果任务没有执行完成,我们可能还想要取消任务的执行,为了支持这一特性,ThreadPoolExecutor ...
- 线上 RPC 偶发超时故障排查及 GC 调优实录
本文概要 RPC服务异常和排查过程 排查方向 问题根因和解决方案 JVM GC 原理与优化方案 基础排查工具使用 问题背景 RPC 服务调用方反馈服务有时会有超时. 查看监控平台发现有客户端调用超时, ...
- 【工具】目前几种常见的线上接口文档管理平台的比较
文章目录 一.前言 二.接口文档在线平台 1.apizza 1.1 文档导出html 1.2 导入Postman.json和Swagger.json文件 2. YApi 2.1 源码开源&免费 ...
- [实战]线上领取优惠券超时
上个月项目比较紧,导致没有太多时间写博客,今天有时间更新一下博客,将前两天解决的线上问题梳理一下,很简单的一个问题,主要排查过程比较有意思,线上打印的日志也并不多. 一.背景 核心实体: 优惠券: ...
- 线上 mysql连接超时_线上环境数据库连接超时原因
查看线上日志发现了如下的异常: ERROR 500.jsp - Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.Com ...
- mysql内存爆_线上MySQL机器内存爆掉原因分析与解决
现象: 阿里金融某业务的MySQL机器的内存每隔几天就会增长,涨上去后,却不下来.累积后内存爆掉. 分析: 此业务是间隔的对MySQL有大访问,其它时间几乎无访问.排查发现,内存涨时,一般会有MySQ ...
最新文章
- 1核1g服务器开多少虚拟主机,1核1g服务器开多少虚拟主机
- 脚本类恶意程序分析技巧汇总
- java 抽象接口类,Java接口(interface)和Java抽象类(abstract class)的区别(详诉版)
- Linux命令整合之find
- 【Windows 10 v1703】解决桌面出现Removable Storage Devices的问题
- JAVA给枚举成员指定值
- Oracle P6培训系列:10增加作业并估算工期
- 计算机网络规范化发生在,关于计算机网络系统工程设计工作规范化的几点建议.pdf...
- OpenCV:图像平移
- scrapy 中 COOKIES_ENABLED 设置
- AVP的商业化之路还有多远?
- sublime text 打开txt文档乱码问题
- Power BI+Power Apps联动初尝试
- 独立站卖家如何利用Google广告引流
- Python多线程爬虫,主播信息资料爬取采集
- VS源文件提取工具vsjuicer 实现细节
- 松江辟出长三角G60科创走廊供给侧结构性改革新路
- Python 高级编程和异步IO并发编程 --13_4 call_soon,call_at,call_soon_threadsafe
- Oracle导入dmp 文件
- 计算机和电气工程研究生就业,56所“电气工程专业”实力很强的大学,毕业后就业率和收入都很高...
热门文章
- 在linux下部署安装Tomact并运行javaWeb工程
- yaourt -S mysql_arch中yaourt的安装和使用
- 2018-3-8(论文--网络评论中的非结构化信息表示与研究)笔记-----基于证据理论的网络评论综合方法
- jquery学习(3)--高级选择器
- C#多线程学习(四) 多线程的自动管理(线程池) (转载系列)——继续搜索引擎研究...
- 青少年编程竞赛交流群周报(第035周)
- 数据结构与算法:13 字符串与整数集合
- 基于Matlab的多层BP神经网络在非线性函数拟合中的应用
- Matlab与机器学习 -- BP网络神经元上的转移函数
- C#语言与面向对象技术(6)