线程池——学习的思考过程

发布于:2025-07-03 ⋅ 阅读:(18) ⋅ 点赞:(0)

问题:

1.什么是线程池?

2.线程池有哪些参数?

3.线程池工作流程是什么?

4.线程池可以用来做什么?(应用场景)


回答:


1.线程池是为了减少频繁的创建线程和销毁线程带来的性能损耗,线程池的工作原理如下图:

2.线程池的构造函数有7个参数:
 

public ThreadPoolExecutor(int corePoolSize,//线程池的核心线程数量 
int maximumPoolSize,//线程池的最大线程数 
long keepAliveTime,//当线程数大于核心线程数时,多余的空闲线程存活的最长时间 
TimeUnit unit,//时间单位 
BlockingQueue<Runnable> workQueue,//任务队列,用来储存等待执行任务的队列 
ThreadFactory threadFactory,//线程工厂,用来创建线程,一般默认即可 
RejectedExecutionHandler handler//拒绝策略,当提交的任务过多而不能及时处理时,我们可以定制策略来处理任务 )

 


这些参数大多都是见名知意,大多就不细讲了。

  • ThreadPoolExecutor.AbortPolicy:抛出 RejectedExecutionException来拒绝新任务的处理。(直接抛出异常)
  • ThreadPoolExecutor.CallerRunsPolicy:调用执行者自己的线程运行任务,也就是直接在调用execute方法的线程中运行(run)被拒绝的任务,如果执行程序已关闭,则会丢弃该任务。因此这种策略会降低对于新任务提交速度,影响程序的整体性能。如果你的应用程序可以承受此延迟并且你要求任何一个任务请求都要被执行的话,你可以选择这个策略。
  • ThreadPoolExecutor.DiscardPolicy:不处理新任务,直接丢弃掉。(直接丢弃)
  • ThreadPoolExecutor.DiscardOldestPolicy:此策略将丢弃最早的未处理的任务请求。(like:LRU(最近最少使用算法),丢弃最久的请求)

3.

4.(池化技术想必大家已经屡见不鲜了,线程池、数据库连接池、HTTP 连接池等等都是对这个思想的应用。池化技术的思想主要是为了减少每次获取资源的消耗,提高对资源的利用率。)
日志记录​​:多线程批量插入日志到MySQL
通知类任务​​:用户注册成功后异步发送邮件或短信
场景示例​​:

  • 每日凌晨备份数据库(ScheduledThreadPool)。
  • 每隔5分钟检查订单支付状态,超时订单自动取消。
     

补充:
 

1.Java中存在哪些线程:虚拟线程和平台线程,虚拟线程是JDK的,由 JVM 调度,许多虚拟线程共享同一个操作系统线程,虚拟线程的数量可以远大于操作系统线程的数量。平台线程是在虚拟线程出来之前,我们一直使用的线程。二者关系 是一个平台线程可以在不同的时间执行不同的虚拟线程,当虚拟线程被阻塞或等待时,平台线程可以切换到执行另一个虚拟线程。

2.线程池设置经验:

  1. CPU密集型:corePoolSize = CPU核数 + 1(避免过多线程竞争CPU)
  2. IO密集型:corePoolSize = CPU核数 x 2(或更高,具体看IO等待时间)

3。shutdown (),shutdownNow()这两个方法有什么作用?:
shutdown():正在执行的继续执行,未执行的中断,此时此刻,不能向里添加新任务。

shutdownNow():停止所有正在执行的线程,不在处理在池中任务(应该是包含线程正在执行的和在队列中的),但一般,他要等所有线程停止后,线程池才结束。

4.进程状态和线程状态:
进程状态:

  • 运行状态(Running):该时刻进程占用 CPU;
  • 就绪状态(Ready):可运行,由于其他进程处于运行状态而暂时停止运行;
  • 阻塞状态(Blocked):该进程正在等待某一事件发生(如等待输入/输出操作的完成)而暂时停止运行,这时,即使给它CPU控制权,它也无法运行;

线程状态:

1. 初始(NEW):新创建了一个线程对象,但还没有调用start()方法。
2. 运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)。就绪状态的线程在获得CPU时间片后变为运行中状态(running)。
3. 阻塞(BLOCKED):表示线程阻塞于锁。
4. 等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。
5. 超时等待(TIMED_WAITING):该状态不同于WAITING,它可以在指定的时间后自行返回。
6. 终止(TERMINATED):表示该线程已经执行完毕。


网站公告

今日签到

点亮在社区的每一天
去签到