线程池的原理、创建方式、常见问题

线程池的原理及创建方式

- 首先我们说说什么是线程池?

java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行的程序都可以使用线程池。
线程是一个重资源,JVM 中的线程与操作系统的线程是一对一的关系,所以在 JVM 中每创建一个线程就需要调用操作系统提供的 API 创建线程,赋予资源,并且销毁线程同样也需要系统调用。

  • 为什么有线程池?

因为线程数太少无法充分利用 CPU ,太多的话由于上下文切换的消耗又得不偿失所以需要控制线程数量。
需要避免线程频繁地创建与销毁,所以要缓存一批线程

- 线程池的好处

1、降低资源消耗
通过重复利用机制降低线程创建和销毁造成的消耗
2、提高响应速度
当任务到达时,任务可以不需要等线程创建就能执行
3、提高线程的可管理性
线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以统一进行分配、优化、监控

- 作用

1、线程池是为突然大量爆发的线程设计的,通过有限的几个固定线程为大量的操作服务,减少了创建和销毁线程所需的时间,从而提高效率
2、如果一个线程的时间非常长,就没必要用线程池了,况且我们还不能控制线程池中线程的开始、挂起、中止。

- 原理

1、当前线程池中的线程数<corePoolSize,则每来一个任务,就会创建一个线程
2、当前线程池中的线程数>=corePoolSize,则每来一个任务,会尝试添加到任务缓存队列中,
若添加成功,则任务会等待空闲线程将其取出去执行,若添加失败,缓存队列满了,会尝试创建新的线程
3、如果缓存队列满了,且总线程数<maximumPoolSize前提下,创建新线程
4、如果总线程已经=maximumPoolSize,则执行任务拒绝策略进行处理
5、如果当前线程池中的线程数>corePoolSize,
这时如果某线程空闲时间>keepAliveTime,线程将被终止,直至线程池中的线程数=corePoolSize,
(如果允许为核心池中的线程设置存活时间,那么核心池中的线程空闲时间>keepAliveTime,线程也会被终止。)
6、线程池的拒绝策略
默认实现是 AbortPolicy 直接抛出异常。
实现 RejectedExecutionHandler 这个接口自定义即可。

- 线程池的分类

ThreadPoolExeutor
Executor框架的最顶层实现是ThreadPoolExecutor类
Executors工厂类中提供的
newSingleThreadExecutor 、
newScheduledThreadPool、
newFixedThreadPool、
newCachedThreadPool方法
其实也只是ThreadPoolExecutor的构造函数参数不同而已。

- 线程池的参数

  • 1、corePoolSize 核心线程数

默认一直存活,即使是闲置状态
达到corePoolSize后,新的任务添加在workQueue
如果ThreadPoolExecutor的allowCoreThreadTimeOut属性设置为true, 就会根据keepAliveTime终止线程

  • 2、maximumPoolSize最大线程数

当线程池中的线程数等于corePoolSize并且workQueue已满,这时就看当前线程数是否大于maximumPoolSize
另外超过 corePoolSize的线程被称做"Idle Thread", 这部分线程会有一个最大空闲存活时间(keepAliveTime),如果超过这个空闲存活时间还没有任务被分配,则会将这部分线程进行回收。
1和2区别:
核心线程数:实际运行的线程数;最大线程数:线程池最多创建的线程数量。corePoolSize<=corePoolSize

  • 3、keepAliveTime非核心线程空闲存活时长

超过这个时长,非核心线程就会被收回,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值