线程池原理解析

本文详细介绍了Java线程池的概念、作用及使用线程池带来的优势,包括减少系统资源消耗、控制并发量。线程池由线程池管理器、工作线程、任务队列和任务组成,常见的线程池类型有SingleThreadExecutor、FixedThreadExecutor、CachedThreadExecutor和ScheduledThreadExecutor。线程池的API包括Executor、ExecutorService、Executors和ThreadPoolExecutor。参数配置如corePoolSize、maximumPoolSize、keepAliveTime等决定了线程池的行为。FixedThreadPool和CachedThreadPool的主要区别在于线程数量的固定与否以及空闲线程的处理策略。线程池的合理配置应考虑任务处理时间和系统资源,避免内存溢出或CPU过高。关闭线程池有两种方式:shutdown()和shutdownNow()。文章还探讨了不同线程池在负载稳定和波动场景下的适用性。

1、为什么要用线程池,线程池的作用(意义),如果使用线程池会有什么好处,说说你对线程池的了解?

创建和销毁线程的代价是很大的,线程不像创建普通object对象那样,在堆中分配点内存就好了的,在new Thread的时候,是先分配内存,但是并没有创建线程,当调用线程的start方法的时候,会通过cpu指令创建一个线程。所以,频繁的创建线程、销毁线程的代价是很大的,会导致系统性能下降。还有,如果频繁创建线程,不加以管理,会导致系统线程过多,影响系统运行。

如果用线程池,指定线程数量,线程池会帮助我们管理线程,我们使用线程可以从线程池获取一个线程,线程干完活,在放回池子里,不会销毁。而且有线程池管理线程,能有效控制线程的数量,不会导致系统创建过多的线程。

  • 创建和销毁线程的代价是很大
  • 能有效控制线程的数量,不会导致系统创建过多的线程。

2、线程池的内部结构(组成)?

Java线程池包含4个部分,线程池的工作原理,是生产者消费者模式的

(1)线程池管理器(ThreadPool):就是负责创建和销毁线程池的

(2)工作线程(PoolWorker):就是线程池中的一个线程

(3)工作任务(Task):这个就是线程池里的某个线程需要执行的业务代码,这个是你自己编写的业务逻辑

(4)任务队列(TaskQueue):这个是扔到线程池里的任务需要进行排队,要进任务队列

3、常用的线程池有哪些?

(1)SingleThreadExecutor(单线程线程池,很少用 -> 自己做一个内存队列 -> 启动后台线程去消费)

里面就一个线程,慢慢消费

(2)FixedThreadExecutor(固定数量线程池):比如说,线程池里面固定就100个线程,超过这个线程数就到队列里面去排队等待

(3)CachedThreadExecutor(自动回收空闲线程,根据需要自动新增线程,传说中的无界线程池???真的无限界吗?):无论有多少任务,根据你的需要,无限制的创建任意多的线程,在最短的时间内来满足你,但是高峰过去之后,如果有大量的线程处于空闲状态,没有活儿可以干,等待60s之后空闲的线程就被销毁了

(4)ScheduledThreadExecutor(线程数量无限制,支持定时调度执行某个线程):提交一个任务,对于这个任务不是立马执行的,是可以设定一个定时调度的逻辑,比如说每隔60s执行一次,这个一般不用,一般来说就用spring schedule的支持

一般其实最常用的是 FixedThreadExecutor 和 CachedThreadExecutor

4、线程池有哪些常用的API?

(1)Executor:代表线程池的接口,有个execute()方法,扔进去一个Runnable类型对象,就可以分配一个线程给你执行

(2)ExecutorService:这是Executor的子接口,相当于是一个线程池的接口,有销毁线程池等方法

-> ExecutorService就代表了一个线程池管理器,会负责管理线程池 ->负责 线程的创建和销毁 -> 队

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值