Javaer,你必须要了解的ExecutorService

2023-05-16

ExecutorService初接触

  之前做的一个功能里有一个耗时操作:处理数据库里对应的记录,然后将每个处理后的结果做个排序。
   恕本人小白,刚开始直接用单线程处理!你敢信?!然后60多万条记录,跑了三分钟才出结果!当时我就震惊了,这尼玛要被“刁”的节奏啊。但我并没有什么好的解决方案,便去咨询老大,然后老大直接丢过来一段代码附带几个字

    public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue<Runnable>());
    }

ExecutorService弄个线程池跑

使用了ExecutorService之后,我便爱上了它!!!

简单介绍

  什么是ExecutorService呢?它实现Executor中的方法,jdk中这样介绍它

public interface Executor
执行已提交的 Runnable
 任务的对象。此接口提供一种将任务提交与每个任务将如何运行的机制(包括线程使用的细节、调度等)分离开来的方法。
。。。
此包中提供的 Executor
 实现实现了 ExecutorService
,这是一个使用更广泛的接口。 ThreadPoolExecutor
 类提供一个可扩展的线程池实现。 Executors
 类为这些 Executor 提供了便捷的工厂方法。

使用场景

  关于场景,就拿我最近做的功能举例

无须等待结果

上一篇采集领英信息最后提到采集慢的原因有一个是“使用单线程”,那好,现在使用ExecutorService创建线程池来加快采集速度(代码就不贴了,写一个大概的思路):
- 创建一个线程池ExecutorService executorService = Executors.newCachedThreadPool();该方法创建一个数量没有上限的线程池

  • 将采集代码中for循环的内容抽出来重构为一个集成Thread的类,因为这样可以传递一些参数,类似下面代码
public class CacheThreadPool {
    public static void main(String[] args) {
        ExecutorService exec = Executors.newCachedThreadPool();
        for (int i = 0; i < 15; i++)
            exec.execute(new MyThread("张"+i));
        exec.shutdown();//并不是终止线程的运行,而是禁止在这个Executor中添加新的任务
    }
}

class MyThread extends Thread {

    private String name;

    public MyThread(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        System.out.println("获取"+name+"的信息并保存");
    }
}

需要注意的是,我for循环中,我不需要等待线程执行结果,因为我不关心每一条是否能成功解析,是否能成功插入数据库。

需要结果

  这个就是开头提到的。现在要开线程跑,但是我不能保证我for循环结束了,每个线程都能返回给我结果,也就是说,我必须要等待线程将60万条数据都处理完,我拿到结果之后,程序才能继续下去。
  jdk里有提供invokeAll方法

 <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException;

执行给定的任务,当所有任务完成时,返回保持任务状态和结果的 Future 列表
这难道就是所谓的“批量执行”?
于是我写了个demo测试了一下,for循环十次,每次处理耗时1s,单线程处理的话就是10s,无可厚非(排除其他一切因素,最理想状态),然后用invokeAll方法批量执行,我预测结果是1s(傻子也猜到了)代码如下:

package com.quick.thread;

import java.util.concurrent.Callable;

/**
 * Created by wangxc on 2017/3/29.
 */
public class TaskSleep implements Callable<Integer> {

    private int num;

    public TaskSleep(int num){
        this.num = num;
    }

    @Override
    public Integer call() throws Exception {
//        System.out.println(num + "--->" +i);
        Thread.sleep(1000);
        return  num;
    }
}
package com.quick.thread;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;

/**
 * Created by wangxc on 2017/3/29.
 */
public class ExecutorServiceDemo {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        long stat = System.currentTimeMillis();
        ExecutorService executorService = Executors.newCachedThreadPool();
        List<TaskSleep> callList = new ArrayList<TaskSleep>();
        for(int i=0;i<10;i++){
            callList.add(new TaskSleep(i));
        }
        List<Future<Integer>> futures = executorService.invokeAll(callList);
        executorService.shutdown();
        int sum=0;
        for(Future<Integer> item:futures){
            sum += item.get();
        }
        System.out.println("结果"+sum);
        long end = System.currentTimeMillis();
        System.out.println((double)(end-stat)/1000);
    }
}

结果

结果45
1.045

嗯,这就是我想要的结果

最后

ExecutorService使用的方式非常之多,适合自己的业务场景才是最主要的,本文是根据自己的业务需求去使用ExecutorService,仅供参考~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Javaer,你必须要了解的ExecutorService 的相关文章

随机推荐

  • 基于ESP32双无刷FOC电机的瓦力平衡机器人(2)

    恍恍惚惚中 xff0c 感觉瓦力已经慢慢悠悠的向我走来 xff0c 看了他的孤独 xff0c 感觉自己的也就不算什么了 断断续续搞了差不多两周的时间 xff0c 总算是把这些底层模块都调通了 xff08 虽然还完全看不出任何瓦力的影子 xf
  • 嵌入式 职位描述 职位要求

    来于智联招聘 前程无忧 xff0c 有关工作经验 xff0c 管理经验 xff0c 学历一并删掉 xff0c 只剩职位描述 职位要求 看看自己还缺些什么 嵌入式软件工程师 关专业 xff0c 本科或以上学历 xff1b 2 基础扎实 xff
  • 信道脉冲响应CIR

    博客写作技巧 xff1a 遇到的问题 如何解决问题 需要那种帮助 信道脉冲响应 xff1a CIR 问题 xff1a 场强测量系统需要获取场强和信道信息 xff0c 那么CIR是什么 xff1f 如何利用CIR反映信道特性 xff1f 解决
  • OpenMV数据打包发送以及STM32对数据的解析(串口方式)

    今天尝试了使用Openmv用串口发送数据 xff0c 32接收 xff0c 遇到了一些坑 xff0c 但是最后还是实现了 xff0c 难住我的地方并不是关于传输的代码 xff0c 而是那个板子串口3不知道因为什么原因接收到的数据是错误的 x
  • linux下 c++ 服务器开发(一)

    苦逼的c 43 43 程序员还没找到工作 xff0c 所以顺便开始写服务器练手 对内容不满意不要喷我我是写给自己看的 xff08 把自己犯得错误记下来 xff09 1 我的电脑是win10的 xff0c 所以先去网上下虚拟机 xff0c 我
  • 最优化算法——常见优化算法分类及总结

    之前做特征选择 xff0c 实现过基于群智能算法进行最优化的搜索 xff0c 看过一些群智能优化算法的论文 xff0c 在此做一下总结 最优化问题 在生活或者工作中存在各种各样的最优化问题 xff0c 比如每个企业和个人都要考虑的一个问题
  • 利用手机摄像头采集图片运行ORB-SLAM2

    一 ROS配置安装 二 ORB SLAM2配置安装 可参考前文 ROS仿真环境安装与配置 身在江湖的郭大侠的博客 CSDN博客 三 Android手机摄像头与ROS建立通信 GitHub有个开源的项目 xff0c 可以通过wifi将摄像头捕
  • VINS_FUSION

    VINS FUSIO xff2e 意义 VINS Fusion在VINS Mono的基础上 xff0c 添加了GPS等可以获取全局观测信息的传感器 xff0c 使得VINS可以利用全局信息消除累计误差 xff0c 进而减小闭环依赖 此外 x
  • VINS_FUSION编译运行

    一 ROS安装 见前文 二 ceres安装 GitHub地址 xff1a GitHub ceres solver ceres solver A large scale non linear optimization library 14 0
  • Turtlebot2简单控制

    遥控 遥控前为了让turtlebot接受命令 xff0c 需要启动 roslaunch turtlebot bringup minimal lauch 键盘操作命令 xff1a roslaunch turtlebot teleop keyb
  • turtlebot2利用turtlebot_exploration_3d进行自主建图

    安装octomap ros和rviz插件 sudo apt get install ros indigo octomap 源码安装 xff1a turtlebot exploration 3d 本机为Ubuntu16对应的ros版本为kin
  • CSDN周赛第十二期

    CSDN的比赛难度相对而且比较简单 xff0c 适合小白练手 xff0c 而且刷题本身在于锻炼思维 xff0c 写出题目不难 xff0c 但是需要拥有缜密的思维才能通过全部的用例 1 豚鼠排名榜 已知字符A B C 每个字符都有自己的权值q
  • rocon app

    规格 xff1a Rapp指代rocon app或者叫robot app 用在机器人的控制中Robotics in Concert xff0c 这是通过 Rapp Manager 安装和执行的元数据 它旨在允许更高级别的控制器采用提供所需公
  • 矩阵按键的两种扫描方法

    1 实验目的 掌握两种按键扫描方法 xff1a 行扫描 xff0c 行列扫描 xff08 高低电平翻转 xff09 2 实验流程图 3 代码分析 xff08 1 xff09 行扫描 include 34 stm32f10x h 34 u16
  • 计算机二进制的浮点表示法

    计算机二进制的浮点表示法 0 1 3 61 0 3 组成 符号位 0表示正 1表示负 指数位 2的n次方 xff0c n 43 127 对于4字节浮点数 xff0c 此处为127 再换算成二进制 尾数位 直接用 过程 将整数部分换算成二进制
  • STM32延时函数的三种方法——最好掌握第三种

    单片机编程过程中经常用到延时函数 xff0c 最常用的莫过于微秒级延时delay us 和毫秒级delay ms 1 普通延时法 这个比较简单 xff0c 让单片机做一些无关紧要的工作来打发时间 xff0c 经常用循环来实现 xff0c 不
  • 【常用模块】HC-05蓝牙串口通信模块使用详解(实例:手机蓝牙控制STM32单片机)

    HC 05蓝牙串口通信模块应该是使用最广泛的一种蓝牙模块之一了 为什么呢 xff1f 因为HC05模块是一款高性能主从一体蓝牙串口模块 xff0c 可以不用知道太多蓝牙相关知识就可以很好的上手 说白了 xff0c 只是个蓝牙转串口的设备 x
  • uln2003驱动电路

    一 uln2003有什么作用 ULN2003是大电流驱动阵列 xff0c 多用于单片机 智能仪表 PLC 数字量输出卡等控制电路中 可直接驱动继电器等负载 输入5VTTL电平 xff0c 输出可达500mA 50V ULN2003是高耐压
  • 简单超声波测距

    用到模块 hc sr04超声波模块 xff0c stm32开发板 本实验通过超声波测距模块得到长度 直接打印到窗口显示 xff0c 故主要用到定时器函数 xff0c 串口函数 hcsr04 c 只需要提供一个 10uS以上脉冲触发信号 xf
  • Javaer,你必须要了解的ExecutorService

    ExecutorService初接触 之前做的一个功能里有一个耗时操作 xff1a 处理数据库里对应的记录 xff0c 然后将每个处理后的结果做个排序 恕本人小白 xff0c 刚开始直接用单线程处理 xff01 你敢信 xff1f xff0