线程池及核心参数

线程池通过复用线程提高效率,减少生命周期中的非运行状态。核心参数包括核心线程和最大线程,确保合理创建与执行任务。线程池有FixedExcutor、SingleThreadPool、CachedThreadPool等类型,底层实现依赖阻塞队列。阻塞队列常用方法如add/offer、peek/poll。线程池带来更快响应、资源节省和更佳的系统管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 为什么需要线程池

一般来说,线程的生命周期需要通过 new(新建)->start(就绪)->running(运行中)->dead(消亡)
假设每个状态到下一个状态需要的时间是
1,2,3 秒
但是我们往往只是关心running 那个状态就可以了,这是线程需要执行的任务
使用线程池,创建一定数量的线程,专门执行任务的run 方法,实现了线程的复用,同时也减少了其他状态的占比,提高了整个系统的运行效率

2 线程池的核心参数

核心线程,最大线程,定义不好解释,还是看这两个参数在执行任务的过程中对worker 线程的创建的影响吧。
这两个参数的目的是:

  1. 尽量少的创建线程(核心线程是初始化线程池时创建的,当有任务来时,核心线程都忙,则往队列放,而不是立刻创建线程)
  2. 尽量快的执行任务(优先使用核心线程执行任务,不够,再入队,队满,使用新线程执行)
  3. 控制最大线程数(资源的限制)
    记忆:任务到来,优先使用核心线程,核心线程数不够,再排队,队列排满再开启新线程执行任务,核心线程+非核心线程数达到最大线程数,则将任务交给拒绝策略处理。
    在这里插入图片描述

3 线程池的分类

FixedExcutor:固定线程池大小
SingleThreadPool:单线程,
CachedThreadPool:可缓存

    Executors.newCachedThreadPool();
    Executors.newSingleThreadExecutor();//单线程线程池
    Executors.newFixedThreadPool(2);//固定线程池大小

4 线程池的底层实现

  1. 使用阻塞队列去放置未被执行的任务
  2. worker 线程则是在执行完当前任务后,从队列中取出任务执行

核心构造方法:

ThreadPoolExecutor(int corePoolSize,// 核心线程数
                              int maximumPoolSize,// 最大线程数
                              long keepAliveTime,// 线程闲闲置存活时间,如果闲置时间超过改时间,则回收该线程(长时间没任务)
                              TimeUnit unit,// 时间单位
                              BlockingQueue<Runnable> workQueue)//任务队列

5阻塞队列的常用方法;

  1. add/offer 入队,前者队列满时,会抛出异常,后者会返回false,offer 还可以设置时间参数,限时入队
  2. peek/pool 返回队头元素,前者返回,但是不移除,后者返回且移除
  3. 读写锁的使用 (ReentrantLock)takeLock,putLock

6 线程池的好处

  1. 响应快:系统启动就创建一部分线程
  2. 降低资源消耗:重复利用机制,减少线程重复创建销毁造成的损耗
  3. 提高线程可管理性:统一分配,调优和监控
Java线程池是一种管理线程的技术,它通过复用已经创建好的线程来提高性能和资源利用率。核心参数主要包括以下几个方面: 1. **核心池大小** (`corePoolSize`): 线程池默认启动的最大线程数。即使所有任务都在队列中等待处理,也超过这个数量。当任务提交并有新线程可用时,多余的线程会立即停止。 2. **最大池大小** (`maximumPoolSize`): 线程池允许的最大线程数。如果超过了这个限制,新的任务将会进入阻塞队列等待,直到有空闲线程可用。 3. **任务队列** (`queue`): 提交的任务在此排队等待。常见的选项包括 `BlockingQueue` 类型,如 `LinkedList`、`ArrayBlockingQueue` 和 `LinkedBlockingQueue`,也可以自定义。 4. **线程工厂** (`threadFactory`): 用于创建新线程的工厂,可以设置线程属性如名称、优先级等。 5. **拒绝策略** (`handler`): 当任务队列已满且最大线程数也达到上限,如何处理新任务。选项有 `AbortPolicy` (默认) 异常抛出,`CallerRunsPolicy` 由提交任务的线程直接运行,`DiscardOldestJobPolicy` 删除队列最老的任务。 工作原理: - 当有新任务提交到线程池时,首先检查核心池内的线程是否足够。如果足够,则交给线程执行;如果足,则创建新线程。 - 如果线程池已满,任务会被放入队列中等待,直到有线程完成或线程池的大小减小。 - 当线程完成后,它们可能会返回到核心池,也可能因拒绝策略而结束,如超时或达到最大线程数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值