当前位置: 首页 > news >正文

探索并发编程:深入理解线程池

文章目录

  • 前言
  • 一、线程池是什么?
  • 二、如何创建线程池
    • 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.lryc.cn/news/321955.html

相关文章:

  • html5cssjs代码 023 公制计量单位进位与换算表
  • UE5.3 StateTree使用实践
  • 【09】进阶JavaScript事件循环Promise
  • 蓝桥备赛----基本语法总结
  • 基于 Echarts + Python Flask ,我搭建了一个动态实时大屏监管系统
  • 针对教育行业的网络安全方案有哪些
  • C++ 编程入门指南:深入了解 C++ 语言及其应用领域
  • latex变量上下加自适应长度箭头
  • 鸿蒙4.0ArkUI快速入门(一)应用模型
  • C++ UML类图
  • Java SE入门及基础(44)
  • 基于Wechaty的微信机器人
  • 【C++ leetcode】双指针问题(续)
  • 51单片机-蜂鸣器
  • 【MySQL】学习和总结使用列子查询查询员工工资信息
  • 突破编程_C++_STL教程( stack 的实战应用)
  • Spring Data访问Elasticsearch----其他Elasticsearch操作支持
  • 代码随想录算法训练营第60天 | 84.柱状图中最大的矩形
  • 【讲解Node.js常用的命令】进阶版
  • 软考81-上午题-【面向对象技术3-设计模式】-行为型设计模式01
  • 【Linux进阶之路】HTTPS = HTTP + S
  • 51-31 CVPR’24 | VastGaussian,3D高斯大型场景重建
  • GPT-4引领AI新纪元,Claude3、Gemini、Sora能否跟上步伐?
  • 图书馆RFID(射频识别)数据模型压缩/解压缩算法实现小工具
  • 【Java Web基础】一些网页设计基础(三)
  • 2 使用GPU理解并行计算
  • Android什么情况下会出现内存泄漏以及怎么解决?
  • kafka集群介绍及搭建
  • 2024/03/19(网络编程·day5)
  • ​LeetCode解法汇总1969. 数组元素的最小非零乘积