使用线程池创建线程

2023-10-27

使用线程池可以不用线程的时候放回线程池,用的时候再从线程池取。

1.5后引入的Executor框架的最大优点是把任务的提交和执行解耦

Executor接口中定义了一个方法execute,该方法接收一个Runable实例,它用来执行一个任务,任务即一个实现了Runnable接口的类。

ExecutorService接口继承自Executor接口,它提供了更丰富的实现多线程的方法。比如,ExecutorService提供了关闭自己的方法,可以调用ExecutorService的shutdown()方法来关闭 ExecutorService,调用该方法后,将导致ExecutorService停止接受任何新的任务且等待已经提交的任务执行完成(已经提交的任务会分两类:一类是已经在执行的,另一类是还没有开始执行的),当所有已经提交的任务执行完毕后将会关闭ExecutorService。因此我们一般用该接口来实现和管理多线程。

ExecutorService的生命周期包括三种状态:运行、关闭、终止。创建后便进入运行状态,当调用了shutdown()方法时,便进入关闭状态,此时意味着ExecutorService不再接受新的任务,但它还在执行已经提交了的任务,当所有已经提交了的任务执行完后,便到达终止状态。如果不调用shutdown()方法,ExecutorService会一直处在运行状态,不断接收新的任务,执行新的任务,服务器端一般不需要关闭它,保持一直运行即可。

 

public class Thread08 {
    public static void main(String[] args) {

        ExecutorService  es= Executors.newCachedThreadPool();//可缓存的线程池

        for (int i = 0; i <5 ; i++) {
            es.execute(new MyExcutor()); //给线程分配任务
                System.out.println("IIIII"+i);
        }

        es.shutdown();//关闭线程
    }
}
class MyExcutor implements Runnable{
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"已经被调用");
    }
}

 

Callable的call()方法只能通过ExecutorService的submit(Callable<T> task) 方法来执行,并且返回一个 <T>Future<T>,是表示任务等待完成的 Future。

submit是首先选择空闲线程来执行任务,如果没有,才会创建新的线程来执行任务。另外,需要注意:如果Future的返回尚未完成,则get()方法会阻塞等待,直到Future完成返回。

public class Thread09 {
    public static void main(String[] args) throws ExecutionException,  InterruptedException {
        test();
    }

    static void test() throws ExecutionException, InterruptedException {

        //创建线程池对象
        ExecutorService es= Executors.newFixedThreadPool(10); //固定数目线程的线程池

        //创建容器对象管理任务的结果
        ArrayList<Future<Integer>> list=new ArrayList<>();

        //提交任务
        for (int i = 0; i <10 ; i++) {

            //10个随机任务
            Callable<Integer> callable=new Callable<Integer>() {

                @Override
                public Integer call() throws Exception {
                    System.out.println(Thread.currentThread().getName()+"开始执行任务");
                    Thread.sleep(500);
                    return (int)(Math.random()*10);
                }
            };

            //用户获得任务结果的Future的对象
            Future<Integer> future=es.submit(callable);

            list.add(future);
        }
        //获得结果
        for (int i = 0; i <10 ; i++) {
            System.out.println(list.get(i).get());
        }
        es.shutdown();//关闭线程
    }
}

public class Thread11 {
    public static void main(String[] args) {

        ExecutorService es= Executors.newSingleThreadExecutor();

        Future<Integer> future=es.submit(new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                return new Random().nextInt(10);
            }
        });
        try {
            Thread.sleep(1000);
            try {
                System.out.println(future.get());
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            es.shutdown();
        }
    }
}

 

 

 

 

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

使用线程池创建线程 的相关文章

  • 面试题:String 和 StringBuilder、StringBuffer 的区别?

    Java 平台提供两种类型的字符串 String 和 StringBuffer StringBuilder 它们可以存储和操作字符串 其中String是只读字符串 也就意味着String 引用的字符串内容是不能被改变的 而StringBuf
  • java 的JDBC操作

    JDBC java数据库连接 提供了一套数据库操作标准 这些标准需要各个数据库厂商去实现并提供一个驱动程序 目前常见的4类JDBC驱动程序 JDBC ODBC 直接利用微软的ODBC进行数据库连接操作 性能低 一般不推荐 JDBC本地驱动
  • 集合框架 — ConcurrentHashMap

    集合框架 ConcurrentHashMap 一 ConcurrentHashMap JDK1 7 1 实现结构 2 保证并发安全 分段锁技术 3 put 和 get 方法 二 ConcurrentHashMap JDK1 8 1 实现结构
  • Java中map的分类和常见的情况

    Java为数据结构中定义了一个接口Java util Map 它有四个实现类 分别是HashMap Hash table LinkedHashMap 和 TreeMap Map主要用于存储键值对 根据键得到值 因此不允许键重复 重复了覆盖了
  • Mysql获取数据库的所有表以及表所有字段信息

    mysql获取所有表以及表所有字段信息 SELECT TB TABLE SCHEMA 模式 TB TABLE NAME 表名 TB TABLE COMMENT 表名注释 COL COLUMN NAME 字段名 COL COLUMN TYPE
  • 什么是“堆”,"栈","堆栈","队列",它们的区别?

    一 堆 什么是堆 又该怎么理解呢 堆通常是一个可以被看做一棵树的数组对象 堆总是满足下列性质 堆中某个节点的值总是不大于或不小于其父节点的值 堆总是一棵完全二叉树 将根节点最大的堆叫做最大堆或大根堆 根节点最小的堆叫做最小堆或小根堆 常见的
  • (转)找不到或无法加载主类(Could not find or load main class )

    原文 https blog csdn net shymi1991 article details 50540214 当我们试图在命令行编译运行一个简单的java程序HelloWorld java 编译命令javac HelloWorld j
  • ⛳ TCP 协议面试题

    目录 TCP 协议面试题 一 为什么关闭连接的需要四次挥 建 连接却只要三次握 呢 二 为什么连接建 的时候是三次握 可以改成两次握 吗 三 为什么主动断开 在TIME WAIT状态必须等待2MSL的时间 四 如果已经建 了连接 但是Cli
  • JAVA异常处理(三种异常处理机制)

    目录 前言 一 异常体系 二 异常示例 1 运行时异常 2 编译时异常 三 异常处理 1 默认异常处理 2 异常处理1 throws 3 异常处理2 try catch 4 异常处理3 前面两者的结合 5 运行时异常的处理 四 自定义异常
  • Servlet详解

    一 Servlet的生命周期 创建Servlet有两个时机 一是客户端第一次请求每个Servlet时 系统创建该Servlet实例 另外是Web应用启动时立即创建Servlet实例 即load on startup Servlet 每个Se
  • String、StringBuffer与StringBuilder之间区别

    String StringBuffer StringBuilder String的值是不可变的 这就导致每次对String的操作都会生成新的String对象 不仅效率低下 而且浪费大量优先的内存空间 StringBuffer是可变类 和线程
  • Stream使用技巧(1)------数据处理技巧

    Stream使用技巧 1 数据处理技巧 一 背景 作为java8新特性之一的Stream API为开发者带来了极大的便利 它可以对我们需要操作的集合进行非常复杂的操作 以活的我们想要的结果 本文不会告诉你什么是Stream 毕竟网上花里胡哨
  • 【Java基础·Comparator多字段排序】

    Java基础 Comparator多字段排序 需求 对指定List按照 身份证号 姓名 入学时间倒序排列 版本1 package com biaogexf tools import lombok Data import java util
  • &和&&的区别(单与和双与的区别)

    和 都可以用作逻辑与的运算符 为短路与 不是短路与 可以作为整数的位运算符 举两个例子 1 对于if str null str equals 这个表达式 当str null 时 后面的表达式就不会执行 也不会出现NullPointerExc
  • super()

    super 关键字 关键字的理解 父类中定义了该方法 但是子类中重写了该方法 使用super来修饰这个方法 在调用的时候调用父类的方法 super关键字的使用 1 super理解为父类 2 super可以用来调用 属性方法和构造器 3 su
  • 【Windows系统5分钟搭建Linux环境】

    安装 Linux 虚拟机 第1步 下载 VirtualBox 第2步 下载 Vagrant 第3步 拉取Linux虚拟机镜像 第4步 网络配置 网络地址转换 端口转发 注意 电脑需要开启 CPU 虚拟化 电脑开机时 进入BIOS界面设置 第
  • Java实验5

    1 为某研究所编写一个通用程序 用来计算每一种交通工具行驶1000公里所需的时间 已知每种交通工具的参数都是3个整数A B C的表达式 现有两种工具Car007和Plane 其中Car007的速度计算公式为A B C Plane的速度计算公
  • 视频流截取保存到本地路径(打包jar包CMD运行)

    需求 现在有一批https的监控视频流URL 需要以多线程模式监听视频流 对视频流进行每三秒截屏一次 将截取的图片post请求发送 根据响应判断图片是否保存到本地 保存时以当前时间命名 代码 BufferedImage类 import or
  • java中 ‘\b‘ 回退符的使用

    退格符 b b是退格符的意思 将光标回退一个字符的位置 可以结合空白字符使用达到类似删除的效果 1 回退符 b 后面没有内容 的情况 原样输出 回退符 b后面 没有内容 则原样输出 System out println x b x 回退符后
  • 总结:对Java内存模型JMM的理解

    JMM规定了线程的工作内存和主内存的交互关系 以及线程之间的可见性和程序的执行顺序 一方面 要为程序员提供足够强的内存可见性保证 另一方面 对编译器和处理器的限制要尽可能地放松 JMM对程序员屏蔽了CPU以及OS内存的使用问题 能够使程序在

随机推荐

  • 【deep_thoughts】48_快速复现PyTorch的Weight Normalization

    文章目录 理论 代码 全连接层 卷积层 视频链接 48 快速复现PyTorch的Weight Normalization 哔哩哔哩 bilibili 官方API torch nn utils weight norm 原始论文 Weight
  • declared implicitly

    declared implicitly 警告 h文件中未声明 如果还是不行 也可以把函数名改了试试
  • 虚拟交换机工作原理

    一 虚拟交换机概述 1 虚拟交换机简介 Switch Virtual Switch 指虚拟交换机或虚拟网络交换机 工作在二层数据网络 通过软件方式实现物理交换机的二层 和部分三层 网络功能 与传统物理交换机相比 虚拟交换机具备的优点 配置灵
  • 谷歌浏览器设置点击链接时打开新窗口

    根据谷歌浏览器的版本而定 我的是 步骤 1 右上角三个点的地方 选设置 2 外观 显示 主页 按钮选 打开新的标签页 OK设置完成
  • 详解大模型微调方法LoRA Adapter(内附实现代码)

    LoRA论文地址 LORA LOW RANK ADAPTATION OF LARGE LANGUAGE MODELS 1 背景介绍 以GPT 3 175B参数量为例 过大的参数量在Finetune的时候代价很大 Adapter适配器方法是进
  • STM32(六)库函数串口发送与接收实例(中断)

    STM系列文章目录 文章目录 STM系列文章目录 前言 一 串口配置步骤 二 实际编写 1 代码部分 重定向fputc函数 GPIO 前言 本篇用库函数写个简单的串口收发 用的是 STM32F103RCT6 开发板 部分来自正点原子 STM
  • rtsp实例及讲解

    rtsp是real time streaming protocol 按照我的理解为流媒体控制协议 协议双方的的编码类型和地址 以及对stream media的控制 play pause record 注意这里不要与RTCP协议搞混 rtcp
  • Mysql—修改用户密码(重置密码)

    Mysql 修改用户密码 重置密码 1 登录mysql 1 2 root localhost mysql uroot p123456 root localhost mysql hlocalhost uroot p123456 如果忘记密码
  • ASP.NET Core 运行原理剖析

    1 ASP NET Core 运行原理剖析 1 1 概述 1 2 文件配置 1 2 1 Starup文件配置 Configure ConfigureServices 1 2 2 appsetting json配置 1 3 处理管道 中间件
  • cesium绘制点、线、面

    cesium绘制点 线 面 地图地形上 点 let handler new Cesium ScreenSpaceEventHandler viewer scene canvas handler setInputAction function
  • 【超级无敌详细的黑马前端笔记!即时更新~】

    超级无敌详细的黑马前端笔记 即时更新 这个笔记 是我自己在同步学习黑马前端使用的 不可以商用哦 学习路径 基础概念铺垫 了解 认识网页 五大浏览器和渲染引擎 Web标准 HTML初体验 HTML的感知 HTML骨架结构 开发工具的使用 语法
  • 【08】STM32·HAL库开发-HAL库介绍

    目录 1 初识HAL库 了解 1 1CMSIS简介 1 2HAL库简介 2 STM32Cube固件包浅析 了解 2 1如何获取STM32Cube固件包 2 2STM32Cube固件包文件夹简介 2 3CMSIS文件夹关键文件 2 3 1CM
  • 增量式pid分析 及 参数整定

    函数功能 增量PI控制器 1 入口参数 编码器测量值 目标速度 2 入口参数 编码器位置 目标位置 返回 值 电机PWM 根据增量式离散PID公式 pwm Kp e k e k 1 Ki e k Kd e k 2e k 1 e k 2 e
  • 宝塔Linux面板—请使用正确的入口登录面板

    请使用正确的入口登录面板 错误原因 当前新安装的已经开启了安全入口登录 新装机器都会随机一个8位字符的安全入口名称 亦可以在面板设置处修改 如您没记录或不记得了 可以使用以下方式解决 解决方法 1 在SSH终端输入以下一种命令来解决 登录你
  • C# 中 KeyPress 、KeyDown 和KeyPress的区别

    1 KeyPress主要用来捕获数字 注意 包括Shift 数字的符号 字母 注意 包括大小写 小键盘等除了F1 12 SHIFT Alt Ctrl Insert Home PgUp Delete End PgDn ScrollLock P
  • 将时间写入数据库时,秒带小数点问题

    1 问题原因 new Date 时间秒带小数点 2 解决思路 将new Date 格式化为年月日时分秒字符串 在将该字符串转为Date 3 示例 Constant类 public final static SimpleDateFormat
  • VScode中文注释乱码问题解决

    VScode默认是用utf 8打开工程代码 C语言里的中文注释如果是Source insight之前gbk编码的注释可能会显示乱码 如何能让代码打开gbk编码的文件也不乱码 设置VScode如下 方法一 依次打开 文件 首选项 设置 然后搜
  • 电机转角控制算法

    时间周期是1 10ms可调 橙色和绿色代表期望和真实速度 红色代表期望角度 紫色代表电机转角 蓝色是减速机输出角度 在9700时刻角度已到达期望角度 速度由 200还未到0 所以算法上需要在要到达目标前某值就需要提前减速 这个值和当前真实速
  • MySQL查询进阶

    多表查询 ALLSOME查询 聚集函数查询 分组查询 分组过滤查询 Student表格 Dept 院系 学院号 学院名 院长 Course表格 Teacher表格 教师号 教师姓名 部门号 工资 SC表格 学号 课程号 分数 反应学生和课程
  • 使用线程池创建线程

    使用线程池可以不用线程的时候放回线程池 用的时候再从线程池取 1 5后引入的Executor框架的最大优点是把任务的提交和执行解耦 Executor接口中定义了一个方法execute 该方法接收一个Runable实例 它用来执行一个任务 任