JAVA多线程实战

由于项目上要和其他系统交互,而该系统采用同步接口,我们采用单线程调用,接收一条数据平均需要4~6s。而我们需要汇总近三个月的订单信息,大约一次有几千条数据,所以进行一次交互大概需要几百分钟。经过沟通后,对方系统不愿意修改他们的程序,所以我们这边就要改成多线程多次同时调用接口,来达到降低处理时间的效果。

话不多说,先上代码

这里用到了线程池ExecutorService

1.线程的创建

线程池一共有五种

经BD后发现所有的线程池最终都是通过ThreadPoolExecutor创建的

其中各个参数说明:

  • corePoolSize : 核心线程数,一旦创建将不会再释放。如果创建的线程数还没有达到指定的核心线程数量,将会继续创建新的核心线程,直到达到最大核心线程数后,核心线程数将不在增加;如果没有空闲的核心线程,同时又未达到最大线程数,则将继续创建非核心线程;如果核心线程数等于最大线程数,则当核心线程都处于激活状态时,任务将被挂起,等待空闲线程来执行。
  • maximumPoolSize : 最大线程数,允许创建的最大线程数量。如果最大线程数等于核心线程数,则无法创建非核心线程;如果非核心线程处于空闲时,超过设置的空闲时间,则将被回收,释放占用的资源。
  • keepAliveTime : 当线程空闲时,所允许保存的最大时间,超过这个时间,线程将被释放销毁,但只针对于非核心线程。
  • unit : 时间单位,TimeUnit.SECONDS等。
  • workQueue : 任务队列,存储暂时无法执行的任务,等待空闲线程来执行任务。
  • threadFactory : 线程工程,用于创建线程。本例用到new ThreadFactoryBuilder().setNameFormat(“thread-call-runner-%d”).build();来为线程创建名称。
  • handler : 当线程边界和队列容量已经达到最大时,用于处理阻塞时的程序

2.创建好了线程后就要执行任务,实现多线程有三种方法

  • 继承Thread类,重写run方法
  • 实现Runnable接口,重写run方法
  • 实现Callable接口,重写call方法(有返回值)

本例中ThreadPoolMakeOrderOutTask用到了第2种方法

3.任务执行完毕,要结束线程池任务

本例调用shutdown() 方法在终止前允许执行以前提交的任务,shutdown()方法的作用是:停止接收新任务,原来的任务继续执行

然后调用awaitTermination(long timeOut, TimeUnit unit)方法,使当前线程阻塞,直到:

  • 等所有已提交的任务(包括正在跑的和队列中等待的)执行完
  • 或者 等超时时间到了(timeout 和 TimeUnit设定的时间)
  • 或者 线程被中断,抛出InterruptedException

然后会监测 ExecutorService 是否已经关闭,返回true(shutdown请求后所有任务执行完毕)或false(已超时)

最后调用shutdownNow()方法,停止接收新任务,原来的任务停止执行

经测试,启用多线程后,发现交互时间确实有明显提升。

Original: https://www.cnblogs.com/cott/p/11963201.html
Author: Cott
Title: JAVA多线程实战

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/713700/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 数组

    是一种用于存储 多个相同数据类型的存储模型 静态初始化 int [] arr = {1,8,12,3,5,9}; int arr2 [] = {1,8,12,3,5,9};//创建…

    技术杂谈 2023年6月21日
    0181
  • 删除IIS日志

    如果服务器IIS访问量比较大,那么IIS日志一定时间后会变的很大,这时候需要手动清理一下。 日志目录可以在IIS中找到。 Original: https://www.cnblogs…

    技术杂谈 2023年5月31日
    0102
  • Homebrew

    /bin/zsh -c "$(curl -fsSl https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)…

    技术杂谈 2023年5月30日
    0117
  • oracle in 条件超长问题解决

    今天做了个es查询地址条件的需求,在回传给使用应用的过程当中,使用的应用出现了错误:in的条件中多于1000个表达式数会报ORA-01795的提示错误。接下来将in中的条件拆分,超…

    技术杂谈 2023年6月1日
    0108
  • Prometheus监控oracle的配置

    告警https://sysdig.com/blog/monitor-oracle-database-prometheus/ Prometheus监控oracle的配置1、下载ora…

    技术杂谈 2023年5月31日
    085
  • DEX文件解析-7、类及其类数据解析(完结篇)

    一、前言 前置技能链接:DEX文件解析—1、dex文件头解析DEX文件解析—2、Dex文件checksum(校验和)解析DEX文件解析–3、de…

    技术杂谈 2023年7月10日
    098
  • JDK、JRE、JVM傻傻分不清?

    JDK、JRE、JVM傻傻分不清? 什么是JVM? JVM全称Java Virutal Machine,即Java虚拟机,用来运行Java字节码文件,JVM是Java跨平台运行的关…

    技术杂谈 2023年7月11日
    095
  • 重新学习数据库(3)

    单元概述 通过本章的学习能够理解MySQL数据库中分组查询的含义,掌握常用分组函数的使用,掌握GROUP BY子句的使用规则,掌握分组后数据结果的条件过滤,掌握SELECT语句执行…

    技术杂谈 2023年6月22日
    0105
  • Servlet4.0 Response

    Servlet4.0 Response对象 Response对象封装Server返回Client的所有信息。在HTTP协议中,Server传达给Client信息转换到HTTP He…

    技术杂谈 2023年7月25日
    082
  • 开发,从未如此清晰

    关于开发,我们已经有了太多的方法论和工具,这之间其实很难说哪个方法论是正确的,哪个工具是最好用的;其实开发是”任性的”,它没有定律,如人饮水冷暖自知,其过程…

    技术杂谈 2023年5月31日
    0134
  • [AWS] Solve Error: User is not authorized to access this resource

    When use AWS API gateway with lambda authorizer, you may get 403 Forbidden error code with…

    技术杂谈 2023年5月30日
    0104
  • dom4j解析xml字符串实例

    DOM4J 与利用DOM、SAX、JAXP机制来解析xml相比,DOM4J 表现更优秀,具有性能优异、功能强大和极端易用使用的特点,只要懂得DOM基本概念,就可以通过dom4j的a…

    技术杂谈 2023年5月31日
    0101
  • 关于CPU的一些基本知识总结

    关于CPU和程序的执行 CPU是计算机的大脑。 程序的运行过程,实际上是程序涉及到的、未涉及到的一大堆的指令的执行过程。 当程序要执行的部分被装载到内存后,CPU要从内存中取出指令…

    技术杂谈 2023年5月31日
    0153
  • 基于Sikuli GUI图像识别框架的PC客户端自动化测试实践

    写在前面 最近两天,公司有个PC客户端的测试任务,除了最基础的功能测试外,还包括稳定性测试和兼容性测试需求。刚好去年接触过Sikuli这款基于GUI图像识别框架的自动化测试工具,于…

    技术杂谈 2023年7月25日
    0102
  • svg图标爽使用

    svg图标爽使用 一、总结 一句话总结: 【网站】:https://iconpark.oceanengine.com/official: 在这个网站可以选择好颜色和样式直接下载下来…

    技术杂谈 2023年5月31日
    0109
  • 简单明了的设计模式-立意篇

    1.岁月的沉淀 我们为什么要学设计模式? 如果是在我刚成为程序员的时候,我大概会这么回答: 因为设计模式是前人经验的总结,可以用来解决特定环境下,重复出现的特定问题。 同时也是程序…

    技术杂谈 2023年7月11日
    091
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球