了解线程池

156 阅读6分钟

要先了解线程池先要知道线程池是什么?

线程池(Thread Pool)是一种多线程的并发模型,它主要用于管理和复用线程对象,提供了一种更加有效地管理多线
程任务的方式。

线程池维护一个固定数量的线程,这些线程事先创建并准备好,可以重复使用。当有任务需要执行时,线程池会分配一
个空闲线程来处理任务,当任务执行完成后,线程可以继续处理下一个任务,而不需要每次都创建和销毁线程,从而减
少了线程创建和销毁的开销。

线程池有助于提高系统的性能和资源利用率,它可以控制线程的数量,避免线程数量过多导致系统负载过大,同时还可
以避免线程不断地创建和销毁带来的开销。线程池还可以管理任务的执行顺序,设置任务的优先级,限制同时执行的任
务数量等。

线程池的七大参数


**七大参数:
1.  核心线程数(Core Pool Size):线程池中保持的最小线程数,即使线程处于空闲状态,也不会被回收。
2.  最大线程数(Maximum Pool Size):线程池中允许的最大线程数,当任务数量超过核心线程数且工作队列已满
时,线程池会创建新的线程,直到达到最大线程数。
3.  空闲线程存活时间(Keep Alive Time):当线程池中的线程数量超过核心线程数时,空闲线程的存活时间。超
过这个时间,空闲线程会被回收,直到线程池中的线程数量不超过核心线程数。
4.  时间单位(Time Unit):空闲线程存活时间的单位,例如毫秒、秒、分钟等。
5.  工作队列(Work Queue):用于存储等待执行的任务的队列。当线程池中的线程都在执行任务时,新的任务会被
放入工作队列中等待执行。
6.  线程工厂(Thread Factory):用于创建新线程的工厂类。
7.  拒绝策略(Rejected Execution Handler):当线程池已经达到最大线程数且工作队列已满时,新的任务无法
被执行时的处理策略。常见的拒绝策略包括抛出异常、丢弃任务、丢弃最旧的任务等。

用我的理解来理解线程池的七大参数

1.核心线程数相当于一个路边的便利店,便利店分长期员工跟临时暑假工,那么核心线程数就是长期工,尽管有些月份这
家便利店的客人相对较少,但这些员工不会长除长期工,而是减少暑假工的招聘数
2.最大线程数: 最大线程数就是指定的最大员工的数量,即为长期工与暑假临时工的总和
3.空闲线程存活时间: 指的是临时暑假工(即临时线程)作为活跃线程的时间(大概可以理解为临时长期工)
4.时间单位: 是给前一个线程赋予单位的,可以是时分秒单位
5.工作队列: 指的是一次性完成多少完成多少任务,若指定的值小于核心线程数,则由核心线程数完成;若指定值大于核
心线程数,则会进入工作队列排队等候,若工作队列未满,依旧是核心线程完成;若队列已满,则会聘请临时线程协助解决
任务,若指定的任务已经达到最大线程且排队队列也满,则会触发拒绝策略;
6.线程工厂: 当这家便利店需要创建新的线程完成任务时(理解为需要员工完成指定的任务时),线程工厂会通过一个
newThread方法创建一个新的线程.该工厂我们可以自定义一个工厂(这里我是这样理解的,可以不必在意: 我们在招工
的时候,会自定义招固定岗位的工人
7. 拒绝策略:上面已经提过了,当线程池已经达到最大线程数且工作队列已满时,新的任务无法被执行时的处理策略。
常见的拒绝策略包括抛出异常、丢弃任务、丢弃最旧的任务等;丢弃最旧的任务指的是最靠近便利店的任务,也就是等的
最久的任务;(理解为顾客来访人数超出员工接待的人员了,最明显的就是海底捞,每次去吃海底捞的时候都要等很久,但
他们不可能抛弃等的最久的客人,这也符合常理,但这是编程,不能那么钻牛角尖,当人数超出时,也只能告知后面来的
客人改日再来了,这也是一种拒绝服务的策略)

线程池中需要注意的点

1.  合理配置线程池参数:根据实际需求合理配置线程池的核心线程数、最大线程数、工作队列大小等参数,以充分
利用系统资源并避免线程过多导致的性能问题。
2.  避免任务堆积:如果线程池的工作队列容量有限,当任务数量超过工作队列大小时,新的任务可能会被拒绝执行。
因此,需要根据实际情况合理设置工作队列的大小,避免任务堆积导致系统性能下降。
3.  考虑任务的执行时间:如果任务的执行时间较长,可能会导致线程池中的线程长时间被占用,无法处理其他任务。
在这种情况下,可以考虑使用定时任务或异步任务来处理耗时的任务,以避免线程池资源的浪费。
4.  错误处理:在任务执行过程中,可能会出现异常或错误。为了保证线程池的稳定性,需要合理处理任务执行过程中
的异常,例如使用合适的异常处理器来处理未捕获的异常,避免线程因异常而终止。
5.  及时释放资源:当不再需要线程池时,应该及时关闭线程池,释放相关资源。这可以通过调用线程池的`shutdown``shutdownNow`方法来实现。

线程池的一些小知识

线程池创建线程时,线程池内部线程的数为零,当有任务需要调动线程数时才会在线程池中创建线程.当第一个任务未完
成时,又有新任务,才会继续在线程池中创建线程;以此方式创建,当任务完成且没有新任务时,根据空线程存活时间,指定
时间内依旧没有任务,会摧毁线程.下次使用时才会再创建新的线程