深入了解线程池(代码实战)

文章目录

  • 前言
  • 一、线程池是什么?
  • 二、如何创建线程池
    • 1.使用Executors类
    • 2.使用ThreadPoolExecutor类手动配置线程池
  • 总结


前言

随着计算机系统的不断发展和进步,我们需要处理更多的并发任务和复杂的操作。而线程池作为一种高效的线程管理机制,可以帮助我们更好地利用系统资源,提高程序的性能和响应速度,本文将给大家介绍下线程池这一技术。


一、线程池是什么?

线程池是一种并发编程的概念和机制,用于管理和调度多个线程执行任务。它由一组预先创建的线程组成,这些线程可以重复使用来处理多个任务,而不需要频繁地创建和销毁线程。通俗地来讲,当我们需要穿衣服时,线程池就像是一个方便的衣柜。我们不必每次都去新建一件衣服(新建线程),而是可以直接从衣柜里拿出一件合适的衣服(复用线程)。当我们穿完衣服后,将它放回衣柜中(线程完成任务后回到线程池)。这样做的好处是避免了频繁创建和销毁衣服(线程),节省了时间和资源。哈哈哈,不知道恰不恰当呢。

二、如何创建线程池

创建线程池有两种常见的方式:第一种是使用 Executors 类提供的工厂方法,第二种是直接使用 ThreadPoolExecutor 类进行手动配置。下面我将分别解释这两种方法。

1.使用Executors类

在 Java 中,Executors 类提供了一些静态工厂方法,用于创建不同类型的线程池。以下是几种常见的方法:

  1. newFixedThreadPool(int Threads): 创建一个固定大小的线程池,其中包含指定数量的线程。

  2. newCachedThreadPool(): 创建一个可缓存的线程池,线程池的大小可以根据需求自动调整。

  3. newSingleThreadExecutor(): 创建一个单线程化的线程池,只有一个工作线程在执行任务。

  4. newScheduledThreadPool(int corePoolSize): 创建一个支持定时任务和周期性任务执行的线程池。

下面是代码示例:

public static void main(String[] args) {// 创建一个固定大小为10的线程池ExecutorService threadPool = Executors.newFixedThreadPool(10);// 提交任务给线程池执行for (int i = 0; i < 20; i++) {threadPool.execute(new Runnable() {public void run() {// 任务逻辑代码...}});}// 关闭线程池threadPool.shutdown();}

2.使用ThreadPoolExecutor类手动配置线程池

如果你需要更精细的控制和灵活性,可以直接使用ThreadPoolExecutor类进行手动配置。ThreadPoolExecutor 是 ExecutorService 接口的一个实现类,它提供了更多的参数和选项,用于自定义线程池的行为。但是如果你要使用这一方法,那么你要理解这里面的七个参数,下面我来给大家介绍下:

  1. corePoolSize(核心线程数):指定线程池中的核心线程数量。核心线程会一直保持存活状态,即使没有任务执行。当新任务到达时,如果核心线程都在忙碌,线程池会创建新线程来处理任务,直到达到核心线程数。

  2. maximumPoolSize(最大线程数):指定线程池中允许的最大线程数量。当任务数量超过核心线程数且等待队列已满时,线程池会创建新线程来处理任务,直到达到最大线程数。超过最大线程数的任务会根据设置的拒绝策略进行处理。

  3. keepAliveTime(空闲线程存活时间):指定非核心线程的空闲存活时间。当线程池中的线程数量超过核心线程数时,空闲的非核心线程会在指定的时间内保持存活状态。如果在此时间内没有任务到达,这些线程会被销毁。

  4. unit(存活时间单位):指定空闲线程存活时间的单位,可以是纳秒、毫秒、秒等。

  5. workQueue(阻塞队列):用于存储等待执行的任务的阻塞队列。当线程池中的线程都在忙碌时,新任务会被放入这个队列中等待执行。

  6. threadFactory(线程工厂):用于创建新线程的工厂类。通过自定义线程工厂,你可以为线程池创建具有特定属性的线程。

  7. handler(拒绝策略):指定当线程池无法执行新任务时的处理策略。常见的拒绝策略包括抛出异常、丢弃任务、丢弃队列中最早的任务或在调用者线程中直接执行任务。

下面是自定义创建线程池的示例:

    private int corePoolSize = 5;// 核心线程数private int maximumPoolSize = 200;// 最大线程数private int keepAliveTime = 0;// 活跃超时时间private TimeUnit unit = TimeUnit.MILLISECONDS;// 毫秒// 保证对象可见性private volatile ThreadPoolExecutor threadPoolExecutor;public void thread() {threadPoolExecutor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit,new ArrayBlockingQueue<Runnable>(10), Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());

总结

以上就是今天要讲的内容,本文仅仅简单介绍了线程池及其创建方法,后续我将会给大家讲解线程池在项目中的具体使用以及关于线程池的更多内容。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EdgeX Foundry 安装部署

文章目录 一、概述1.官方文档2.Docker Compose 生成器3.创建 docker-compose 文件 二、安装准备1. 克隆服务器2.安装 Docker3.安装 docker-compose 三、非安全模式部署1.docker-comepse2.启动 EdgeX Foundry3.访问 UI3.1. consul3.2. EdgeX Console EdgeX Foundry # EdgeX Fou…

Android之Handler原理解析与问题分享

一、Handler运行原理剖析 1.关系剖析图 如果把整个Handler交互看做一个工厂&#xff0c;Thread就是动力MessageQueue是履带Looper是转轴Loooper的loop方法就是开关&#xff0c;当调用loop方法时整个工厂开始循环工作&#xff0c;处理来自send和post提交到MessageQueue的消息&a…

SQL执行后台脚本

SQL进程中断实验 我们操作数据库时&#xff0c;经常遇到数据导入等特别耗时的SQL操作&#xff0c;而关闭MySQL客户端或SSH终端&#xff0c;就会立马关闭SQL会话&#xff0c;导致SQL执行中断&#xff0c;如下实验&#xff1a; 在第一个SSH终端执行 # 进入Mysql客户端&#xf…

08. Nginx进阶-Nginx动静分离

简介 什么是动静分离&#xff1f; 通过中间件将动态请求和静态请求进行分离。分离资源&#xff0c;减少不必要的请求消耗&#xff0c;减少请求延时。 动静分离的好处 动静分离以后&#xff0c;即使动态服务不可用&#xff0c;静态资源仍不受影响。 动静分离示意图 动静分离…

Day16:信息打点-语言框架开发组件FastJsonShiroLog4jSpringBoot等

目录 前置知识 指纹识别-本地工具-GotoScan&#xff08;CMSEEK&#xff09; Python-开发框架-Django&Flask PHP-开发框架-ThinkPHP&Laravel&Yii Java-框架组件-Fastjson&Shiro&Solr&Spring 思维导图 章节知识点 Web&#xff1a;语言/CMS/中间件/…

Linux中断实验:定时器按键消抖处理实验一测试

一. 简介 前面文章实现了定时器对按键的消抖处理,文章地址如下: Linux中断实验:定时器实现按键消抖处理-CSDN博客 本文对所实现的定时器对按键消抖功能进行测试。确认定时器是否实现对按键消抖的功能。 二. Linux中断实验:定时器按键消抖处理的测试 1. 拷贝驱动模块…

Python的http模块requests

模块简介&#xff1a; requests 库是一个 python中比较有名的 http请求的库&#xff0c;能处理 get,post,put,delete 等 restful请求&#xff0c;能设置 header&#xff0c;cookie,session 等操作&#xff0c;也是作为爬虫的基础库&#xff0c;它目前还不能异步请求,如果要支持…

Docker 安装mysql8并运行

一.拉取镜像 方法1&#xff1a;docker pull mysql:8.0 方法2&#xff1a; 如果公司服务器不让上外网&#xff0c;那么下载个镜像&#xff0c;拷贝到服务器上 下载镜像地址&#xff1a; https://download.csdn.net/download/cyw8998/88906130 docker load -i mysql8 二.运…

适用于 Windows 的 5 款最佳免费数据恢复软件榜单

每个计算机用户都曾经历过数据丢失的情况。很容易错误地删除重要的文件和文件夹&#xff0c;当发生这种情况时&#xff0c;可能会导致不必要的心痛和压力。值得庆幸的是&#xff0c;可以恢复 Windows PC 上丢失的数据。在本文中&#xff0c;我们将分享您可以使用的五种最佳 Win…

【问答】stm32复用时钟开启情况

首先为什么要开启时钟&#xff1f; 答&#xff1a;因为要对寄存器进行读写&#xff01;而在STM32中对寄存器的读写都是要打开寄存器对应的时钟才可以的【就像人一样&#xff0c;有了跳动的脉搏手臂才能有能量才能进行各种动作】。 然后就什么时候AFIO时钟开启&#xff08;所有…

苹果因在iOS音乐流媒体市场上的反向引导行为,在欧盟被罚款18.4亿欧元

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Docker之自定义镜像上传阿里云

目录 一. Alpine制作jdk镜像 1.1 alpine Linux 简介 1.2 基于alpine制作jdk8镜像 1.2.1 下载镜像 1.2.2 创建并编辑Dockerfile 1.2.3 上传文件 1.2.4 执行Dockerfile构建镜像 1.2.5 测试 二. Alpine制作jre镜像 2.1 首先下载jre或者上传 2.2 解压 2.3 测试 2.4 返回上级目录&a…

云手机的境外舆情监控应用——助力品牌公关

在当今数字化时代&#xff0c;社交媒体已成为品牌传播和互动的主要平台。随之而来的是海量的信息涌入&#xff0c;品牌需要及时了解并应对海外社交媒体上的舆情变化。本文将介绍如何通过云手机进行境外舆情监控&#xff0c;更好地帮助企业公关及时作出决策。 1. 境外舆情监控与…

Linux——动态库和静态库

目录 前言 一.静态库 1.1生成静态库 1.2 库搜索路径 1.3 静态库优点 1.4 静态库缺点 二.动态库 2.1 生成动态库 2.2 使用动态库 2.3 运行动态库 2.4 动态库的优点 2.5 动态库的缺点 三.链接过程 四.如何创建和管理库 五.总结 前言 Linux系统中的库&#xff08;…

【linux】linux系统调用及文件IO操作

一、系统调用 1、概述 系统调用&#xff1a; 就是操作系统内核 提供给用户可以操作内核 一组函数接口。用户 借助 系统调用 操作内核。比如用户可以通过文件系统相关的调用请求系统打开文件、关闭文件或读写文件&#xff0c;可以通过时钟相关的系统调用获得系统时间或设置定时…

golang关键字channel介绍

Golang 关键字 channel 的用法和原理 Golang 是一门支持并发编程的语言&#xff0c;它提供了一种特殊的类型&#xff1a;channel&#xff0c;用于在不同的 goroutine 之间传递数据&#xff0c;实现同步和通信。channel 是 Go 语言高性能并发编程中的核心数据结构和机制。本文将…

如何创建测试计划?这些要考虑到

以下为作者观点&#xff1a; 创建一个彻底和有效的测试计划对软件测试的成功至关重要。它可以帮助识别过程中可能出现的潜在问题或问题。 什么是测试计划&#xff1f; 测试计划是一份文件&#xff0c;概述了软件测试过程的策略、目标、资源和时间表。测试计划通常包括一些细…

Golang 锁介绍

在并发编程中&#xff0c;锁是一种常用的同步机制&#xff0c;用来保护共享资源的安全访问和修改。Golang 作为一门支持并发的语言&#xff0c;提供了两种主要的锁类型&#xff1a;互斥锁&#xff08;Mutex&#xff09;和读写锁&#xff08;RWMutex&#xff09;。本文将介绍这两…

uniapp 项目 浏览器chrome使用vue devtool 识别不了 in not detect

问题 uniapp的项目&#xff0c;vue2&#xff0c; chrome 分析 添加了运行时&#xff0c;指定模板h5.html 指定的h5.html重置了运行根目录&#xff0c;导致了vue dev tool在运行时&#xff0c;chrome上识别不了。 解决&#xff1a; 方法1&#xff1a; 只能调试的时候,不加sati…

java常用应用程序编程接口(API)——Arrays概述

前言&#xff1a; 学到Arrays了&#xff0c;整理下心得。打好基础&#xff0c;daydayup! Arrays 用来操作数组的一个工具类 Arrays的常见方法 方法名说明public static String toString(类型[] arr)返回数组的内容public static int[ ] copyOfRange(类型[ ] arr,启示索引&…