由于项目上要和其他系统交互,而该系统采用同步接口,我们采用单线程调用,接收一条数据平均需要4~6s。而我们需要汇总近三个月的订单信息,大约一次有几千条数据,所以进行一次交互大概需要几百分钟。经过沟通后,对方系统不愿意修改他们的程序,所以我们这边就要改成多线程多次同时调用接口,来达到降低处理时间的效果。
话不多说,先上代码
这里用到了线程池ExecutorService
1.线程的创建
线程池一共有五种
经BD后发现所有的线程池最终都是通过ThreadPoolExecutor创建的
其中各个参数说明:
- corePoolSize : 核心线程数,一旦创建将不会再释放。如果创建的线程数还没有达到指定的核心线程数量,将会继续创建新的核心线程,直到达到最大核心线程数后,核心线程数将不在增加;如果没有空闲的核心线程,同时又未达到最大线程数,则将继续创建非核心线程;如果核心线程数等于最大线程数,则当核心线程都处于激活状态时,任务将被挂起,等待空闲线程来执行。
- maximumPoolSize : 最大线程数,允许创建的最大线程数量。如果最大线程数等于核心线程数,则无法创建非核心线程;如果非核心线程处于空闲时,超过设置的空闲时间,则将被回收,释放占用的资源。
- keepAliveTime : 当线程空闲时,所允许保存的最大时间,超过这个时间,线程将被释放销毁,但只针对于非核心线程。
- unit : 时间单位,TimeUnit.SECONDS等。
- workQueue : 任务队列,存储暂时无法执行的任务,等待空闲线程来执行任务。
- threadFactory : 线程工程,用于创建线程。本例用到new ThreadFactoryBuilder().setNameFormat("thread-call-runner-%d").build();来为线程创建名称。