快速了解线程池

文章目录

  • 一. 线程池初了解
    • 1. 什么是线程池
    • 2. 使用线程池的好处
  • 二. 线程池再了解
    • 1. ThreadPoolExecutor类的重要配置
    • 2. 线程池的工作流程
    • 3. 使用Java标准库创建线程
  • 三. 模拟实现简易线程池

一. 线程池初了解

1. 什么是线程池

线程池是一种采用池化思想(同理还有常量池,内存池等)来管理和复用线程的技术。线程池中有若干已经创建的线程和一个存放执行任务的阻塞队列,当队列中有待执行的任务时线程可以直接取出并执行,对于已经执行完任务的线程并不会直接销毁,而是进行适当地复用以处理更多的多线程任务,从而达到提高程序性能 和 降低系统开销的目的。

2. 使用线程池的好处

  1. 提高程序的响应速度:线程池中管理了若干已经创建的线程,当新任务到来时无需进行线程的创建就可对任务进行处理。
  2. 降低系统的开销:线程池可以对已经创建的线程进行复用,避免了频繁创建和销毁线程带来的系统开销。
  3. 提高线程的可管理性:线程池可以对线程进行统一的分配、调优和监控。

二. 线程池再了解

在Java中,ExecutorService 是管理线程池和所提交的任务的重要接口,它表示一个线程池示例,通过该接口的方法我们可以了解线程池基本方法的使用(如下表)。
其中 ThreadPoolExecutor类 是 ExecutorService接口的一个主要实现类,获得线程池主要有两种方法:(1)直接实例化ThreadPoolExecuto类,并手动对ThreadPoolExecuto类进行参数配置(2)通过Executors这个工厂类的工厂方法获取ThreadPoolExecuto类。

ExecutorService的主要方法:
在这里插入图片描述

1. ThreadPoolExecutor类的重要配置

若通过直接实例化的方式获取 ThreadPoolExecutor类,可通过以下参数对线程池进行相关的配置。

  1. corePoolSize(核心线程数):当线程池空闲时,即线程池中队列没有待执行任务时仍然保留的线程数量。
  2. maximumPoolSize(最大线程数):线程池允许存在的最大线程数,当待处理任务减少时,部分线程可能会被销毁,即 corePoolSize <= 线程数量 <= maximumPoolSize。
  3. keepAliveTime(最长空闲存活时间):当线程数量大于核心线程数时,多余线程被允许存活的最长时间,超过该时间未执行新任务的多余线程将被销毁。
  4. unit(时间单位):keepAliveTime参数的时间单位。
  5. workQueue(工作队列):传递任务的阻塞队列,可根据不同需求指定不同的队列类型;若对任务的优先级有要求,可选择PriorityBlockingQueue,若任务数量变动较大,可选择LinkedBlockingQueue等。
  6. threadFactory(创建线程的工厂):使用 ThreadFactory工厂类来创建线程,可以自动对线程相关属性进行设置。
  7. handle(拒绝策略):当阻塞队列中待处理的任务数量达到队列的最大容量时,对继续添加的任务采取适当的拒绝策略(4种)。

在这里插入图片描述

2. 线程池的工作流程

在这里插入图片描述

3. 使用Java标准库创建线程

在Java标准库中,主要通过 Executors这个工厂类的4个主要方法来获取线程池 ThreadPoolExecutor类 的实例,但方法的返回值为 ThreadPoolExecutor类 的实现接口 ExecutorService。(方法简介如下)
在这里插入图片描述

使用示例如下:
Executors.newCachedThreadPool()

public static void main(String[] args) throws InterruptedException {
    // 创建一个 线程数目动态变化的 线程池
    // 当线程池中的任务数 较少时,会适当的销毁线程;当待执行的任务数较多时, 会适当地创建更多 新的线程以执行任务
    ExecutorService service = Executors.newCachedThreadPool();
    for (int i = 0; i < 20; i++) {
        int id = i;
        service.submit(() -> {
            System.out.println("i = " + id);
        });
    }
}    

部分执行结果如下:
在这里插入图片描述

==========分割线
Executors.newSingleThreadPool():队列任务为顺序执行

public static void main(String[] args) throws InterruptedException {
    // 创建一个 只有一个线程 执行线程任务的线程池
    // 线程池每次只能执行 一个线程任务, 多余的任务会在任务队列中等待执行
    ExecutorService service = Executors.newSingleThreadExecutor();
    for (int i = 0; i < 20; i++) {
        int id = i;
        service.submit(() -> {
            System.out.println("i = " + id);
        });
    }
}    

在这里插入图片描述

三. 模拟实现简易线程池

实现线程池,需要有一个阻塞队列来存放执行任务和若干线程执行任务,并在队满时继续提交任务执行一定的拒绝策略(这里采用阻塞等待的方式)。

具体的步骤如下:

  1. 在线程池实例化时创建一定数量的线程,每个线程的工作内容是利用循环的方式扫描是否有待执行任务,若有则取出队列任务并执行。
  2. 创建固定容量的阻塞队列(ArrayBlockingQueue)用于接收添加任务。
  3. 为线程池提供提交任务的方法。

具体代码如下:

class MyThreadPool {
    // 用来存放线程池中 要执行的任务
     BlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(50);

     public MyThreadPool(int n) {
         for (int i = 0; i < n; i++) {
             Thread t = new Thread(() -> {
                // 每个线程采用死循环的方式扫描是否有待执行的任务
                while (true) {
                    try {
                        Runnable task = queue.take();
                        task.run();
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }

                }
             });
             t.start();
         }
     }

     // 向线程池中添加任务
     public void submit(Runnable runnable) throws InterruptedException {
         queue.put(runnable);
     }

}

以上就是本篇文章的全部内容了,如果这篇文章对你有些许帮助,你的点赞、收藏和评论就是对我最大的支持。
另外,文章的不足之处,也希望你可以给我一点小小的建议,我会努力检查并改进。

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

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

相关文章

由vscode自动升级导致的“终端可以ssh服务器,但是vscode无法连接服务器”

问题描述 简单来说就是&#xff0c;ssh配置没动&#xff0c;前两天还可以用vscode连接服务器&#xff0c;今天突然就连不上了&#xff0c;但是用本地终端ssh可以顺利连接。 连接情况 我的ssh配置如下&#xff1a; Host gpu3HostName aaaUser zwx现在直接在终端中进行ssh&am…

[Python] 什么是KMeans聚类算法以及scikit-learn中的KMeans使用案例

什么是无监督学习&#xff1f; 无监督学习是机器学习中的一种方法&#xff0c;其主要目的是从无标签的数据集中发现隐藏的模式、结构或者规律。在无监督学习中&#xff0c;算法不依赖于任何先验的标签信息&#xff0c;而是根据数据本身的特征和规律进行学习和推断。无监督学习…

重写Sylar基于协程的服务器(6、HOOK模块的设计)

重写Sylar基于协程的服务器&#xff08;6、HOOK模块的设计&#xff09; 重写Sylar基于协程的服务器系列&#xff1a; 重写Sylar基于协程的服务器&#xff08;0、搭建开发环境以及项目框架 || 下载编译简化版Sylar&#xff09; 重写Sylar基于协程的服务器&#xff08;1、日志模…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之MenuItemGroup组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之MenuItemGroup组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、MenuItemGroup组件 该组件用来展示菜单MenuItem的分组。 子组件 无 接…

项目中使用sonar扫码代码

1.在maven的settings.xml配置 org.sonarsource.scanner.maven <profiles> <profile><id>sonar</id><activation><activeByDefault>true</activeByDefault></activation><properties><!-- Optional URL to server. D…

AI应用开发-git开源项目的一些问题及镜像解决办法

AI应用开发相关目录 本专栏包括AI应用开发相关内容分享&#xff0c;包括不限于AI算法部署实施细节、AI应用后端分析服务相关概念及开发技巧、AI应用后端应用服务相关概念及开发技巧、AI应用前端实现路径及开发技巧 适用于具备一定算法及Python使用基础的人群 AI应用开发流程概…

okhttp 的 拦截器

拦截器有很多作用&#xff0c;实现就是责任链模式&#xff0c;细节&#xff0c;等我有时间补上。 后面有时间更新一下。 OkHttp最核心的工作是在 getResponseWithInterceptorChain() 中进行&#xff0c;在进入这个方法分析之前&#xff0c;我们先来了 解什么是责任链模式&…

【Linux】打包压缩跨系统/网络传输文件常用指令完结

Hello everybody!在今天的文章中我会把剩下的3-4个常用指令讲完&#xff0c;然后开始权限的讲解。那废话不多说&#xff0c;咱们直接进入正题&#xff01; 1.zip/unzip&tar命令 1.zip/unzip 在windows系统中&#xff0c;经常见到带有zip后缀的文件。那个东西就是压缩包。…

由于误删了node依赖,导致这后面的一系列操作

文章目录 1. 事发原因&#xff1a;Delete select files2. Delete select files引起的cross-env报错3. cross-env是node_modules的依赖工具4. 那么Delete selected files到底是什么操作5. 重装node_modules依赖包&#xff0c;也报错6. 报错&#xff1a;cb() never called!7. 算了…

JS第一天、数据类型检测、内存释放

复习&#xff1a; 以下类型都是 object console.log(typeof new Object); console.log(typeof new Array()); console.log(typeof new Date()); console.log(typeof new RegExp()); console.log(typeof new String()); console.log(typeof new Number()); console.log(typeof…

内裤洗衣机到底值不值得买?四款好用的内衣裤洗衣机推荐

随着内衣洗衣机的流行&#xff0c;很多小伙伴在纠结该不该入手一款内衣洗衣机&#xff0c;专门来洗一些贴身衣物&#xff0c;答案是非常有必要的&#xff0c;因为我们现在市面上的大型洗衣机只能做清洁&#xff0c;无法对我们的贴身衣物进行一个高强度的清洁&#xff0c;而小小…

Zoho Projects与Jira:中国市场的理想替代品之争?

在软件开发生命周期中&#xff0c;项目管理一直是一个非常重要的环节。为了更好地协作、追踪项目的进程和管理任务&#xff0c;许多公司选择了Jira这款著名的项目管理工具&#xff0c;它是个非常强大的工具&#xff0c;但是作为一款纯国外产品&#xff0c;他可能不适合中国市场…

CCReportAdv的一个配置技巧

关于CCReportAdv CCReportAdv是我们推出的基于经典WinCC/TIA WinCC Prof.的一款报表控件。它支持导入Excel模板&#xff0c;可以灵活生成美观的数据报表。 配置示例 CCReportAdv功能非常强大。通过简单的配置就可以生成客户需要的报表。以下面这款报表为例&#xff0c;参见下面…

STM32F407 CAN参数配置 250Kbps

本篇CAN参数适用 芯片型号&#xff1a;STM32F407xx系统时钟&#xff1a;168MHz&#xff0c;CAN挂载总线APB1为42M波 特 率 &#xff1a;250Kpbs引脚使用&#xff1a;TX_PB9&#xff0c;RX_PB8&#xff1b;修改为PA11PA12后&#xff0c;参数不变。 步骤一、打勾开启CAN&#xf…

20240131在ubuntu20.04.6下使用whisper不同模式的比对

20240131在ubuntu20.04.6下使用whisper不同模式的比对 2024/1/31 16:07 首先你要有一张NVIDIA的显卡&#xff0c;比如我用的PDD拼多多的二手GTX1080显卡。【并且极其可能是矿卡&#xff01;】 2、请正确安装好NVIDIA最新的驱动程序和CUDA。可选安装&#xff01; 3、配置whisper…

CTFshow 5——23

借鉴博客 misc5 下载完后&#xff0c;用winhex打开 在最后就可以找到flag misc6 和misc5一样 &#xff08;推测&#xff1a;可能是jpg这种看得见的图片&#xff0c;用winhex&#xff09; misc7 misc8 前置工具安装 这里可以看看见两个png 然后我们在我们的文件夹里面有个…

Oracle12c之修改连接数后导致的故障处理

Oracle12c之修改连接数后导致的故障处理 文章目录 Oracle12c之修改连接数后导致的故障处理1. 故障原因2. 故障信息3. 解决方法1. 首先登陆到数据库&#xff0c;创建临时pfile2. 手动修改创建的pfile.bac3. 以创建的临时文档启动数据库实例4.按照临时pfile中的内容重新创建pfile…

解决浏览器端 globalThis is not defined 报错

解决浏览器端 globalThis is not defined 报错 前言解决办法&#xff1a; 前言 在使用低版本火狐浏览器出现报错globalThis is not defined 解决办法&#xff1a; 在vue的index.html 中添加 this.globalThis || (this.globalThis this) <head><script>this.g…

C语言搭配EasyX实现贪吃蛇小游戏

封面展示 内部展示 完整代码 #define _CRT_SECURE_NO_WARNINGS #include<easyx.h> #include<stdio.h> #include<mmsystem.h> #pragma comment (lib,"winmm.lib") #define width 40//宽有40个格子 #define height 30//长有40个格子 #define size 2…