Java之线程池详解

一、什么是线程池,线程池有什么好处?

将多个线程对象放在容器中,使用时不用new,可直接拿来用,同时Java提供了线程池的创建方式:Executors工具类
好处:
1. 节省开屁线程时间。
2. 提高代码执行效率,线程复用。

二、创建线程池的7个参数

1.corePoolSize:线程池中的常驻核心线程数(核心线程数)
在创建了线程池后,当有请求任务进来之后,就会安排池中的线程去执行请求任务,近似理解为今日当值线程,当线程池中的线程数目达到corePoolSize后,就会把到达的任务放入缓存队列中。

2.maximumPoolSize:线程池能够容纳同时执行的最大线程数,此值必须大于等于1 (非核心线程数或最大线程数)

3.keepAliveTime:多余的空闲线程的存活时间(空闲时间)。
当前线程池数量超过corePoolSize时,当空闲时间达到keepAliveTime值时,多余空闲线程会被销毁直到只剩下corePoolSize个线程为止默认情况下,只有当线程池中的线程数大于corePoolSize时,keepAliveTime才会起作用,直到线程池找那个的线程数不大于corePoolSize。

4.unit:keepAliveTime的单位(时间单位)

5.workQueue:任务队列,被提交但尚未被执行的任务(队列)

6.threadFactory:表示生成线程池中工作线程的线程工厂,用于创建线程一般默认即可(线程工厂)

7.handler:拒绝策略,表示当队列满了并且工作线程大于等于线程池最大线程数(maximumPoolSize)时如何处理 (拒绝策略)

三、四种创建线程池的方式

四种创建线程其实都用了同一种创建线程的方式,只是参数不一样

1. Executors.newCachedThreadPool(); 创建一个单线程的线程池

创建速度:快
corePoolSize:0
maximumPoolSize:int最大值
keepAliveTime:60L
workQueue:SynchronousQueue
理解: 核心数为0,有一个线程就创建一个(因为最大线程数是int最大值,所以容易cpu很高)

2.Executors.newFixedThreadPool(10):创建一个固定大小的线程池,每次提交一个任务就创建一个线程,直到达到线程池的最大。

创建速度:慢
corePoolSize:实际传入的个数
maximumPoolSize:实际传入的个数
keepAliveTime:0
workQueue:LinkedBlockingQueue(队列每次最大能放传入的参数个数,装满一次在提交一次)
理解: 因为队列的的大小是int最大值,队列线程太多容易出现内存溢出,因为线程队列任务满了

3.Executors.newSingleThireadPool(): 创建一个单线程池

创建速度:很慢
corePoolSize:1
maximumPoolSize:1
keepAliveTime:0L
workQueue:LinkedBlockingQueue
理解: 和固定大小线程池一样,只是固定大小为。内存溢出问题:因为队列的的大小是int最大值,队列线程太多容易出现内存溢出,因为线程队列任务满了

4.Executors.newScheduledThireadPool(): 创建一个大小无线的线程池

线程池执行多任务的情况下
在创建的线程池中,如有100个线程任务,核心数为10,最大线程数为20,队列大小为10,当执行100个任务是,会在第31个线程触发拒绝策略异常,因为最大线程20+队列10=30,执行31个任务就触发了拒绝策略

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值