欢迎关注方志朋的博客,回复”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相关推荐

  1. 接口经常超时?线程池+ FutureTask来解决!

    之前红包权益领取查询的接口超时了,因为有用户订购的权益有点多 解决方案 用线程池+ FutureTask将1个查询拆分成多个小查询 选择FutureTask是因为它具有仅执行1次run()方法的特性( ...

  2. Java线上接口耗时分析神器 Arthas

    文章目录 背景 问题 Arthas github地址 官网文档地址: 说明 安装 运行Arthas trace命令的使用 统计时间不准确问题 总结 背景 有时候我们在对线上接口作性能优化的时候需要找出 ...

  3. 一次线上生产问题的全面复盘 【定位-分析-解决】

    来自:crossoverJie 目录: 写在前面 生产现象 定位问题 解决办法 本地模拟 内存分析 总结 写在前面 之前或多或少分享过一些内存模型.对象创建之类的内容,其实大部分人看完都是懵懵懂懂,也 ...

  4. future java 原理_Java线程池FutureTask实现原理详解

    前言 线程池可以并发执行多个任务,有些时候,我们可能想要跟踪任务的执行结果,甚至在一定时间内,如果任务没有执行完成,我们可能还想要取消任务的执行,为了支持这一特性,ThreadPoolExecutor ...

  5. 线上 RPC 偶发超时故障排查及 GC 调优实录

    本文概要 RPC服务异常和排查过程 排查方向 问题根因和解决方案 JVM GC 原理与优化方案 基础排查工具使用 问题背景 RPC 服务调用方反馈服务有时会有超时. 查看监控平台发现有客户端调用超时, ...

  6. 【工具】目前几种常见的线上接口文档管理平台的比较

    文章目录 一.前言 二.接口文档在线平台 1.apizza 1.1 文档导出html 1.2 导入Postman.json和Swagger.json文件 2. YApi 2.1 源码开源&免费 ...

  7. [实战]线上领取优惠券超时

    上个月项目比较紧,导致没有太多时间写博客,今天有时间更新一下博客,将前两天解决的线上问题梳理一下,很简单的一个问题,主要排查过程比较有意思,线上打印的日志也并不多. 一.背景 核心实体: 优惠券:  ...

  8. 线上 mysql连接超时_线上环境数据库连接超时原因

    查看线上日志发现了如下的异常: ERROR 500.jsp - Error querying database.  Cause: com.mysql.jdbc.exceptions.jdbc4.Com ...

  9. mysql内存爆_线上MySQL机器内存爆掉原因分析与解决

    现象: 阿里金融某业务的MySQL机器的内存每隔几天就会增长,涨上去后,却不下来.累积后内存爆掉. 分析: 此业务是间隔的对MySQL有大访问,其它时间几乎无访问.排查发现,内存涨时,一般会有MySQ ...

最新文章

  1. 1核1g服务器开多少虚拟主机,1核1g服务器开多少虚拟主机
  2. 脚本类恶意程序分析技巧汇总
  3. java 抽象接口类,Java接口(interface)和Java抽象类(abstract class)的区别(详诉版)
  4. Linux命令整合之find
  5. 【Windows 10 v1703】解决桌面出现Removable Storage Devices的问题
  6. JAVA给枚举成员指定值
  7. Oracle P6培训系列:10增加作业并估算工期
  8. 计算机网络规范化发生在,关于计算机网络系统工程设计工作规范化的几点建议.pdf...
  9. OpenCV:图像平移
  10. scrapy 中 COOKIES_ENABLED 设置
  11. AVP的商业化之路还有多远?
  12. sublime text 打开txt文档乱码问题
  13. Power BI+Power Apps联动初尝试
  14. 独立站卖家如何利用Google广告引流
  15. Python多线程爬虫,主播信息资料爬取采集
  16. VS源文件提取工具vsjuicer 实现细节
  17. 松江辟出长三角G60科创走廊供给侧结构性改革新路
  18. Python 高级编程和异步IO并发编程 --13_4 call_soon,call_at,call_soon_threadsafe
  19. Oracle导入dmp 文件
  20. 计算机和电气工程研究生就业,56所“电气工程专业”实力很强的大学,毕业后就业率和收入都很高...

热门文章

  1. 在linux下部署安装Tomact并运行javaWeb工程
  2. yaourt -S mysql_arch中yaourt的安装和使用
  3. 2018-3-8(论文--网络评论中的非结构化信息表示与研究)笔记-----基于证据理论的网络评论综合方法
  4. jquery学习(3)--高级选择器
  5. C#多线程学习(四) 多线程的自动管理(线程池) (转载系列)——继续搜索引擎研究...
  6. 青少年编程竞赛交流群周报(第035周)
  7. 数据结构与算法:13 字符串与整数集合
  8. 基于Matlab的多层BP神经网络在非线性函数拟合中的应用
  9. Matlab与机器学习 -- BP网络神经元上的转移函数
  10. C#语言与面向对象技术(6)