妙用 FutureTask + 线程池:轻松解决接口超时问题!

这篇具有很好参考价值的文章主要介绍了妙用 FutureTask + 线程池:轻松解决接口超时问题!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

来源:blog.csdn.net/qq_44384533/article/details/112324224

之前红包权益领取查询的接口超时了,因为有用户订购的权益有点多

解决方案

用线程池+ FutureTask将1个查询拆分成多个小查询 选择FutureTask是因为它具有仅执行1次run()方法的特性(即使有多次调用也只执行1次),避免了重复查询的可能。而且多任务异步执行也能提高接口响应速度。

本文主要讲的是线程池搭配FutureTask异步执行的例子。

推荐一个开源免费的 Spring Boot 实战项目:

https://github.com/javastacks/spring-boot-best-practice

线程池 + 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;
 @Test
 public 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>() {
    @Override
    public 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();
  //打印: 100
  System.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(),有异常会从这里拿出来。

近期热文推荐:

1.1,000+ 道 Java面试题及答案整理(2022最新版)

2.劲爆!Java 协程要来了。。。

3.Spring Boot 2.x 教程,太全了!

4.别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!

5.《Java开发手册(嵩山版)》最新发布,速速下载!

觉得不错,别忘了随手点赞+转发哦!文章来源地址https://www.toymoban.com/news/detail-749855.html

到了这里,关于妙用 FutureTask + 线程池:轻松解决接口超时问题!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 解决 Axios 跨域问题,轻松实现接口调用

    跨域是指访问另外一个域的资源,由于浏览器的同源策略,默认情况下使用 XMLHttpRequest 和 Fetch 请求时是不允许跨域的。跨域的根本原因是浏览器的同源策略,这是由浏览器对 JavaScript 施加的安全限制。 跨域请求被阻止 (Cross-Origin Request Blocked) : 这是由浏览器实施的同源策略

    2024年02月05日
    浏览(89)
  • JUC-线程Callable使用与FutureTask源码阅读

    Callable简单使用 带返回值的线程(实现implements Callable返回值类型),使用示例 FutureTask面向对象方式学习 为了定义这样一个事物“有返回结果”,暂且称之为RunnableFuture。它集合了Runnable和Future两种事物 (其中Future接口 表示了一个任务的生命周期,是一个可取消的异步运算,可

    2024年02月04日
    浏览(34)
  • Java 高级应用-多线程-(四)FutureTask的介绍及使用

    Java多线程之FutureTask的介绍及使用 FutureTask属于java.util.concurrent 包;FutureTask表示可取消的异步计算。FutureTask类提供了一个Future的基本实现 ,具有启动和取消计算的方法,查询计算是否完整,并检索计算结果。结果只能在计算完成后才能检索; 如果计算尚未完成,则get方法将阻

    2024年02月07日
    浏览(34)
  • 接口响应时间长,前端返回请求超时解决

    1. 全局设置 axios.defaults.timeout = 时间 // 单位为毫秒 或 2. 封装的http请求 或 3. nginx默认的响应时间是60S 还需要修改nginx.conf文件 在配置的请求代理下添加 单位为秒

    2024年02月12日
    浏览(61)
  • 面试官问我:线程锁导致的kafka客户端超时,如何解决?

    本文分享自华为云社区《线程锁导致的kafka客户端超时问题》,作者: 张俭 。 有一个环境的kafka client发送数据有部分超时,拓扑图也非常简单 我们先对客户端的环境及JVM情况进行了排查,从JVM所在的虚拟机到kafka server的网络正常,垃圾回收(GC)时间也在预期范围内,没有

    2024年02月03日
    浏览(45)
  • 【并发编程】Java的Future机制详解(Future接口和FutureTask类)

    目录 一、彻底理解Java的Future模式 二、为什么出现Future机制 2.1 Future 类有什么用? 三、Future的相关类图 2.1 Future 接口 2.2 FutureTask 类 五、FutureTask源码分析 5.1 state字段 5.2 其他变量 5.3 CAS工具初始化 5.4 构造函数 5.5 jdk1.8和之前版本的区别 六、Callable 和 Future 有什么关系? 七、

    2024年02月03日
    浏览(38)
  • CSDN博客批量查询质量分https://yma16.inscode.cc/请求超时问题(设置postman超时时间)(接口提供者设置了nginx超时时间)

    https://yma16.inscode.cc/ 查询别人的一下子就返回了,查询我自己的,1分钟还不返回,然后就显示超时了。。 一开始我还以为是这个开源项目本身的问题,设置了请求超时时间,我还给它改了超时时间,后来发现不是的。。。 本来是100000的,我给改成1000000了,我对js代码不熟,

    2024年02月12日
    浏览(51)
  • 解决运行clickhouseSql超时问题

    在平时工作中,会用到dolphinscheduler/datagrip/dbever等运行clickhouseSql,而clickhouse的jdbc在运行过程中给予我的痛苦可不是一星半点,常常运行一个sql会报错,没错,就是timeout。查阅各种资料后,找到了一个成本较低的解决方案。 clickhouse作为一款近即席的数据库,数据处理是比较

    2024年02月11日
    浏览(69)
  • 接口的妙用

    JDK8开始接口中新增的方法 JDK7以前: 只能定义抽象方法 JDK8的新特性: 接口中可以定义有方法体的方法 允许在接口中定义 默认方法 ,需要用default修饰 解决接口升级的问题 皆空中默认方法的定义格式 格式:public default 返回值类型 方法名(参数类型){} 接口中默认方法

    2024年02月11日
    浏览(22)
  • 如何解决路由协议发布超时问题?

    链路状态广播是链接状态协议使用的一个分组,它包括有关邻居和通道成本的信息,每一个OSPFLSA都有一个生存期,它指示LSA是否仍然还有效。一旦LSA到达了最大生存期,它就会被抛弃,本篇要给大家介绍如果发生超时的情况,应该如何解决。 一、网络环境 网络中,在水星

    2024年02月05日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包