Java之线程池:线程池常用类、接口;线程池执行流程,配置参数,分类

线程池

什么是线程池?

在这里插入图片描述

线程池:一种基于池化思想管理和使用线程的机制

线程池常用类和接口

  • ExecutorService接口:进行线程池的操作访问
  • Executors类:创建线程池的工具类
  • ThreadPoolExecutor及其子类:封装线程池的核心参数和运行机制

线程池常见的方法:

  1. 执行无参返回值的线程任务:void execute(Runnable command);
  2. 提交有返回值的线程任务:Future<T> submit(Callable<T> task);
  3. 关闭线程池:void shutdown();shutdownNow();
  4. 等待线程池关闭:boolean awaitTermination(long timeout,TimeUnit unit);

线程池执行流程

在这里插入图片描述

  1. 提交一个新的线程任务,线程池判断池中是否存在空闲线程;如果存在分配空闲线程执行线程任务;
  2. 如果线程池中没有空闲的线程,则判断核心线程数是否超出设定,未超出则创建核心线程,用于执行新提交的线程任务;
  3. 如果已超出核心线程数,则往工作队列中存放(工作队列:先进先出),当出现空闲线程时,从工作队列中依次取出线程任务;
  4. 如果工作队列已经存满,则判断最大线程数是否超出,未超出最大线程数,则创建非核心线程,执行线程任务;
  5. 如果已达到了最大线程数,则启动拒绝策略;

线程数的配置参数

corePoolSize线程池核心线程数:可以理解为线程池维护的最小线程数,核心线程创建后不会被回收。大于核心线程数的吸纳成,在空闲时间超过keepAliveTime后会被回收

maximumPoolSize线程池最大线程数:线程池允许创建的最大线程数量(包含核心线程池数量)

keepAliveTime非核心线程存活时间:当一个可被回收的线程的空闲时间大于keepAliveTime就会被回收

TimeUnit时间单位:参数keepAliveTime的时间单位

BlockingQueue阻塞工作队列:用于存储等待执行的任务

ThreadFactory线程工厂:用于创建线程,以及自定义线程名称,需要实现ThreadFactory接口

RejectedExecutionHandler拒绝策略:当线程池中的线程耗尽,并且工作队列已满时,新提交的任务,将会启动拒绝策略处理

线程池的分类

  • FixedThreadPool:线程数固定的线程池

    通过Executors.newFixedThreadPool(n);方法创建

    // 创建有十个线程的线程池
    Executors.newFixedThreadPool(10);
    
    // Executors.newFixedThreadPool(n)方法源码
    public static ExecutorService newFixedThreadPool(int nThreads) {
      return new ThreadPoolExecutor(nThreads, nThreads,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>());
    }
    

    通过源码,FixedThreadPool线程池的核心线程数和最大线程数都是传入的参数,所以是固定线程数的线程池;

  • CacheThreadPool:线程数根据任务动态调整的线程池

    通过Executors.newCachedThreadPool();方法创建

    // 创建一个CacheThreadPool线程池
    Executors.newCachedThreadPool();
    
    // 源码
    public static ExecutorService newCachedThreadPool() {
      return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                    60L, TimeUnit.SECONDS,
                                    new SynchronousQueue<Runnable>());
    }
    

    通过源码,CacheThreadPool线程池的核心线程数为0,最大线程数为Integer的最大值,非核心线程的存活时间为60s

  • SingleThreadPool:仅提供一个单线程的线程池

    通过Executors.*newSingleThreadExecutor*();方法创建

    // 创建一个SingleThreadPool线程池
    Executors.newSingleThreadExecutor();
    
    // 源码
    public static ExecutorService newSingleThreadExecutor() {
      return new FinalizableDelegatedExecutorService
        (new ThreadPoolExecutor(1, 1,
                                0L, TimeUnit.MILLISECONDS,
                                new LinkedBlockingQueue<Runnable>()));
    }
    

    通过源码,SingleThreadPool线程池的核心线程数和最大线程数都为1,其他线程的存储时间为0

  • ScheduledThreadPool:能实现定时、周期性任务的线程池

    通过Executors.newScheduledThreadPool(n);方法创建

    // 创建一个ScheduledThreadPool线程池
    Executors.newScheduledThreadPool(10);
    
    // 源码
    public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
      return new ScheduledThreadPoolExecutor(corePoolSize);
    }
    										⬇⬇⬇⬇⬇⬇
    
    // new ScheduledThreadPoolExecutor(corePoolSize);方法源码
    public ScheduledThreadPoolExecutor(int corePoolSize) {
      super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
            new DelayedWorkQueue());
    }
    

    通过源码,ScheduledThreadPool线程池的核心线程数为传入的参数,最大线程数为Integer类型的最大值,非核心线程的存活时间为0,空闲立马被回收

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/408372.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

K线实战分析系列之九:顶底判断——流星和倒锤子线

K线实战分析系列之九&#xff1a;顶底判断——流星和倒锤子线 一、流星线二、倒锤子线三、总结流星形态和倒锤子形态 一、流星线 主要特征是实体比较小&#xff0c;位于低端位置&#xff0c;带着长上影线&#xff0c;就像流星划过天际时&#xff0c;拖着一个长长的尾巴&#xf…

Unity(第三部)新手绘制地形

1、创建地形 游戏对象3d对象地形 2、功能 1、 红框内按键为创建相邻地形、点击后相近地形会呈现高亮框、点击高亮区域可以快速创建地形 每块地形面积是1km*1km 2、第二个按钮是修改地形 下面的选择是修改类型 选项含义描述Raise or Lower Terrain升高或降低地形单击左键可…

STM32 TCP实现OTA

芯片&#xff1a;stm32f407 开发平台&#xff1a;stm32cubeide 上位机开发平台&#xff1a;visual studio 2017 1. FLASH分配 将flash划分为四个部分&#xff1a; bootloader: 0x8000000-0x800ffff app1: 0x8010000-0x805ffff app2: …

GEE入门篇|遥感专业术语(实践操作3):时间分辨率(Temporal Resolution)

目录 时间分辨率&#xff08;Temporal Resolution&#xff09; 1.Landsat 2.Sentinel-2 时间分辨率&#xff08;Temporal Resolution&#xff09; 时间分辨率是指特定传感器图像流的重访时间或时间节奏&#xff0c;重访时间是指卫星连续访问地球表面同一位置…

程序员副业接单做私活避坑指南

最近有不少读者私信我想接私活&#xff0c;想赚外快。 这篇文章系统的分享了对接单做私活这件事情的思考&#xff0c;也给出一些干货建议。希望让大家少走一些弯路&#xff0c;不要被坑。 先说结论 不建议大家在接单这个事情上投入太大精力&#xff0c;如果你“贼心不改”&am…

Nginx基本操作

目录 引言 一、Nginx配置文件详解 &#xff08;一&#xff09;配置文件 &#xff08;二&#xff09;模块 二、全局配置文件 &#xff08;一&#xff09;关闭版本或修改版本 1.关闭版本号 2.修改版本信息 &#xff08;二&#xff09;修改启动的进程数 &#xff08;三&…

MongoDB之客户端工具与核心概念及基本类型篇

MongoDB之客户端工具与核心概念及基本类型篇 文章目录 MongoDB之客户端工具与核心概念及基本类型篇1. MongoDB是什么?1. 关于MongoDB2. 相关客户端工具1. MongoDB Compass2. Studio 3T3. Navicat for MongoDB4. NoSQL Manager for MongoDB Professional 2.MongoDB相关概念2.1 …

Linux安装JDK,Tomcat,MySQL的安装以及项目部署

一、jdk安装配置 传入资源 连接后&#xff0c;创建存放资源的文件&#xff0c;将jdk&#xff0c;tomcat&#xff0c;Mysql的压缩包复制到文件中。 输入命令: cd javaCloudJun/software (进入要文件中) 输入命令 : pwd (查看当前的文件路径) 将文件路径复制到左边的搜索框中…

接口测试实战--自动化测试流程

一、项目前期准备 常见项目软件架构: springMvc:tomcat里运行war包(在webapps目录下) springboot:java -jar xx.jar -xms(**) 运行参数 springCloud:k8s部署,使用kubectl create -f xx.yaml 接口自动化测试介入需越早越好,只要api定义好就可以编写自动化脚本; 某个…

掌握BeautifulSoup4:爬虫解析器的基础与实战【第91篇—BeautifulSoup4】

掌握BeautifulSoup4&#xff1a;爬虫解析器的基础与实战 网络上的信息浩如烟海&#xff0c;而爬虫技术正是帮助我们从中获取有用信息的重要工具。在爬虫过程中&#xff0c;解析HTML页面是一个关键步骤&#xff0c;而BeautifulSoup4正是一款功能强大的解析器&#xff0c;能够轻…

typecho 给文章创建目录树

受益于 shortcode 短代码插件和泽泽短代码中目录树的显示样式&#xff0c;形成了自己实现添加文章目录的思路&#xff1a; 一、文章目录树的结构 <div id"toc"><div class"toc-left"><div class"toc-btn" type"button&quo…

1.QT简介(介绍、安装,项目创建等)

1. QT介绍 Qt&#xff08;官方发音 [kju:t]&#xff09;是一个跨平台的C开发库&#xff0c;主要用来开发图形用户界面&#xff08;Graphical User Interface&#xff0c;GUI&#xff09;程序 Qt 是纯 C 开发的&#xff0c;正常情况下需要先学习C语言、然后在学习C然后才能使用…

三院院士 Michael I. Jordan 指出:大模型在两个方向仍需 “努力“,补充过度自信问题和逆转诅咒问题

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 三院院士 Michael I. Jordan 指出&#xff1a;大模型在两个方向仍需 “努力“ Michael I. Jordan 的个人主页&#xff1a;https://people.eecs.berkeley.edu/~jordan/ 回顾过去的一年&#xff0c;大模…

【数据结构和算法初阶(c语言)】数据结构前言,初识数据结构(给你一个选择学习数据结构和算法的理由)

1.何为数据结构 数据结构(Data Structure)是计算机存储、组织数据的方式&#xff0c;指相互之间存在一种或多种特定关系的 数据元素的集合。本质来讲就是在内存中去管理数据方式比如我们的增删查改。在内存中管理数据的方式有很多种&#xff08;比如数组结构、链式结构、树型结…

【Spring MVC】处理器映射器:AbstractHandlerMethodMapping源码分析

目录 一、继承体系 二、HandlerMapping 三、AbstractHandlerMapping 四、AbstractHandlerMethodMapping 4.1 成员属性 4.1.1 MappingRegistry内部类 4.2 AbstractHandlerMethodMapping的初始化 4.3 getHandlerInternal()方法&#xff1a;根据当前的请求url&#xff0c;…

linux安装sqoop

目录 下载配置 下载 本地下载好上传&#xff0c;解压&#xff0c;重命名&#xff0c;注意路径 tar -zxvf /opt/sqoop/sqoop-1.4.6.tar.gz -C /opt/ mv /opt/sqoop-1.4.6.bin__hadoop-2.0.4-alpha /opt/sqoop配置 环境变量 echo export SQOOP_HOME/opt/sqoop/ >> /etc…

FISCO BCOS(二)———配置及使用控制台

一、前言 FISCO BCOS是由金融区块链合作联盟&#xff08;深圳&#xff09;与微众银行共同发起的开源区块链项目&#xff0c;支持多链多账本&#xff0c;满足金融行业复杂业务需求。本文将介绍如何在Ubuntu操作系统上使用Linux命令配置FISCO BCOS的控制台并进行get/set操作。 目…

文生视频模型调研

文生视频只有OpenAI的Sora&#xff0c;其他的&#xff08;&#xff09;都是动图。 OpenAI发布了可以生成60s视频的Sora模型。刚刚发布的google的Gemini pro 1.5就一下子变得无人问津了&#xff0c;太尴尬了。 在这之前视频生成的天花板是Runway&#xff0c;支持最多18s视频生成…

设计模式-创建型模式-建造者模式

建造者模式&#xff08;Builder Pattern&#xff09;&#xff1a;将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。建造者模式是一种对象创建型模式。 建造者模式一步一步地创建一个复杂的对象&#xff0c;它允许用户只通过指定复杂对象…

MBG(Mybatis-Generator)生成代码

目录 步骤&#xff1a; 1. 创建数据库表 2. 配置 MyBatis Generator 3. 运行 MyBatis Generator 4. 编写业务逻辑 在实际开发中&#xff0c;你会发现有很多重复的工作&#xff1a; 首先是PO对象&#xff0c;我们往往创建与数据库表字段一一对应的PO对象; 其次在Mapper里…