目录
1.简单理解一下线程池
2.线程池参数
3.Executors
1.简单理解一下线程池
线程池,就是用来存储线程的,然后如果有任务传进线程池里,那么空闲的线程就会去执行传进来的任务
打个比方:
把洗浴中心看成一个线程池,当有顾客进来消费时,那么就会有一个搓澡师傅对这个顾客执行任务,不断的有顾客进来,剩下的搓澡师傅就会为其服务,如果前面的搓澡师傅服务完上一个顾客,那么这个搓澡师傅就可以接待下一个顾客,但是当有一天生意火爆时,同一时间顾客数大于搓澡师傅的数量时,这些顾客就会阻塞等待搓澡完成手里的工作,再对其进行服务
再来谈谈使用线程池的目的:
在日常开发中,虽说创建销毁线程的开销要比进程小的多,但是频繁的创建销毁线程也消耗系统资源,然而使用线程池,线程池通过对线程的复用,从而达到减少系统资源开销的效果
线程池的优势:
● 提高性能:创建和销毁线程会消耗系统资源,包括CPU时间和内存。线程池通过复用线程,减少了这种资源开销。例如,在处理大量短时间任务时,频繁创建线程会使程序变慢,而线程池能使程序高效运行。
● 控制资源:线程池可以限制同时执行的线程数量,防止过多线程耗尽系统资源。比如在一个服务器应用中,合理设置线程池大小能保证服务器稳定运行,避免因过多线程导致内存不足或系统崩溃。
● 便于管理:可以统一管理线程的生命周期、任务分配和执行情况。例如,通过线程池能够方便地监控哪些线程在工作、哪些在等待,以及任务的排队情况等。
2.线程池参数
1.Java标准库中提供ThreadPoolExecutor这个类来创建线程池
2.这个类中最核心的方法是submit(Runnable)方法(用来将要执行的任务添加到线程池里面)
3.ThreadPoolExecutor类的构造方法有4种
其中第4个构造方法的参数最多,了解了这个构造方法的参数,其他构造方法的参数也就了解了
1.int orePoolSize:
core是核心的意思
size是个数的意思
所以这个参数的意思是核心线程的个数
核心线程是不管任务多少,只要线程池不被销毁(且不允许核心线程超时退出的情况下),如果核心线程被设置为允许超时退出,那么核心线程一旦未接到任务的时间超过超时时间就会被销毁
2.int maximumPoolSize:
max为最大
所以maximumPoolSize为最大线程数
最大线程数=核心线程数+非核心线程数
非核心线程相当于临时工,在核心线程忙不过来的时候帮忙处理任务,但非核心线程的最大值不能超过最大线程数与核心线程数的差
非核心线程一旦未接到任务的时间超过超时时间就会被销毁
3.long keepAliveTime:
时间,当非核心线程超过该时间没有接到任务,没有接到任务的非核心线程就会被销毁
4.TimeUnit unit:
超时时间的单位
TimeUnit是Java中的一个枚举类型,位于java.util.concurrent包中,用于在不同的时间单位之间进行转换以及执行基于时间的操作,以下是详细介绍:
时间单位
• 基本单位:包括纳秒(NANOSECONDS)、微秒(MICROSECONDS)、毫秒(MILLISECONDS)、秒(SECONDS)、分(MINUTES)、时(HOURS)、天(DAYS)这7种时间单位,这些单位在表示时间跨度和执行定时任务时经常用到。
• 单位换算:TimeUnit提供了方便的单位换算方法。例如,从毫秒转换为秒,可以使用TimeUnit.SECONDS.convert(long duration, TimeUnit unit)方法,其中duration是要转换的时长,unit是原始时间单位。
5.BlockingQueue<Runnable> workQueue:
工作队列,使用submit方法将任务添加到队列中,然后线程池中的线程再从队列中拿去任务进行执行
6.ThreadFactory threadFactory:
线程工厂,我们不用自己创建线程工厂,直接调用
Executors.defaultThreadFactory()就行
7.RejectedExecurionHandler:
拒绝策略
对于线程池来说,发现入队列操作时,队列满了,不会真的触发‘入队列1操作’,不会真阻塞,而是执行拒绝策略相关的代码
ThreadPoolExecutor类里面为我们提供了4种拒绝策略:
这4种拒绝策略都是ThreadPoolExecutor中的静态方法
3.Executors
为了简化ThreadPoolExecutor对象的实例化,JAVA标准库中还提供了Executors类
Executors创建线程池的几种方式:
1. newFixedThreadPool:创建固定线程数的线程池
2.newCachedThreadPool:创建线程数目动态增长的线程池.
3.newSingleThreadExecutor:创建只包含单个线程的线程池.
4.newScheduledThreadPool:设定延迟时间后执行命令,或者定期执行命令.是进阶版的Timer.Executors本质上是ThreadPoolExecutor类的封装