java中的线程池

本文详细介绍了Java中线程池的概念及其重要性,包括降低资源消耗、提高响应速度和服务稳定性等优势。文中还列举了四种常见线程池类型:可缓存线程池、定长线程池、单线程化线程池和定期线程池,并解释了它们的特点及应用场景。

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

什么是线程池

一种池化技术,帮助我们创建,销毁,管理线程。减少线程对象的创建、回收次数,提高服务效率。

为什么要使用线程池

  • 降低资源销毁

通过重复利用已经创建的线程,降低线程创建和销毁造成的消耗。

  • 提高响应速度

当任务到达时,任务可以不需要等到线程创建就能立即执行。

  • 提高线程的可管理性

线程是稀缺资源,如果无限制的创建,不仅会消耗资源,还会降低系统的稳定性,使用线程池可以进行统一的分配、调优和监控。

  • 防止服务器过载

防止内存溢出或CPU耗尽。

常用的线程池

可缓存线程池

创建一个可缓存线程池,如果线程池长度超过处理需求,可灵活回收空闲线程,如无可回收,则新建线程。

在这里插入图片描述
在这里插入图片描述

定长线程池

创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。

在这里插入图片描述
在这里插入图片描述

单线程化的线程池

创建一个单线程化的线程池,它只会用唯一的工作线程去执行任务,保证所有任务按照指定顺序执行。

在这里插入图片描述
在这里插入图片描述

定期线程池

创建一个定期线程池,支持定时及周期性任务执行。

在这里插入图片描述
在这里插入图片描述

线程池配置参数

继承关系:
在这里插入图片描述
ThreadPoolExecutor类的构造方法:
在这里插入图片描述

参数:
corePoolSize:线程池中的核心线程数量,在没有用的时候也不会被回收。
maximumPoolSize:线程池中可以容纳的最大线程数量。
keepAliveTime:线程池中除了核心线程之外的其他线程可以保留的最长时间,即非核心线程可以保留的最长时间。
unit:计算时间的单位。
workQueue:等待队列,任务可以存储在等待队列中等待被执行,原则是FIFO(先进先出)。
handler:拒绝策略。

提交任务的过程:
在这里插入图片描述
拒绝策略:

当任务队列满了之后,如果还有任务提交过来吗,会触发拒绝策略
AbortPolicy:不执行新任务,直接抛出异常,提示线程池已满,默认该方式。
CallerRunsPolicy:直接调用execute来执行当前任务。
DiscardPolicy:丢弃任务,但是不抛出异常。
DiscardOldestPolicy:抛弃任务队列中最旧的任务也就是最先加入队列的,再把这个新任务添加进去。先从任务队列中弹出最先加入的任务,空出一个位置,然后再次执行execute方法把任务加入队列。

Java线程池的参数包括以下7个: 1. corePoolSize:线程池的基本大小,即在没有任务需要执行的时候线程池的大小。 2. maximumPoolSize:线程池最大的大小,即线程池中允许的最大线程数。 3. keepAliveTime:线程池中的线程空闲后,保持存活的时间。 4. unit:keepAliveTime的时间单位。 5. workQueue:任务队列,用于保存等待执行的任务的阻塞队列。 6. threadFactory:线程工厂,用于创建新线程。 7. handler:拒绝策略,用于当任务队列已满,且线程池中的线程数达到maximumPoolSize时,如何拒绝新任务的策略。 下面是一个示例代码,展示了如何使用Java中的线程池参数: ```java import java.util.concurrent.*; public class ThreadPoolDemo { public static void main(String[] args) { // 创建一个线程池 ThreadPoolExecutor executor = new ThreadPoolExecutor( 2, // corePoolSize 4, // maximumPoolSize 60, // keepAliveTime TimeUnit.SECONDS, // unit new ArrayBlockingQueue<Runnable>(4), // workQueue Executors.defaultThreadFactory(), // threadFactory new ThreadPoolExecutor.AbortPolicy() // handler ); // 提交任务 for (int i = 0; i < 10; i++) { executor.execute(new Task(i)); } // 关闭线程池 executor.shutdown(); } static class Task implements Runnable { private int num; public Task(int num) { this.num = num; } @Override public void run() { System.out.println("正在执行task " + num); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("task " + num + "执行完毕"); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值