线程池面试

java线程池面试

最近在面试中,经常被问到线程池,于是将线程池的知识点总结起来…秋招,冲冲冲!!!
请添加图片描述

1.为啥用线程池?

引入线程池的作用主要是控制运行的线程的数量,处理的过程中将任务放入到队列里,然后线程创建后启动这些任务,如果线程数量超过最大线程数。需要线程排列等待,等到其他线程执行完毕后,再从队列里取出任务来执行。

线程在创建和关闭的时候需要时间,如果为每一个任务都去创建一个线程,会非常的消耗资源,因此,使用线程池可以避免增加创建和销毁线程的资源消耗,提高响应速度,且线程还可以复用。

2.线程池的特点

  • 更好的管理线程:使用线程池可以统一分配,监控线程
  • 线程复用
  • 降低资源的消耗
  • 提高响应速度:当任务到达时候,任务可以不需要等待线程的创建就可以被执行

3.线程池创建的四种方法?

1、使用newCachedThreadPool 可缓存的线程池
 ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
2、使用newFixedThreadPool 指定线程池的大小
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
3、使用newSingleThreadExecutor 创建一个单线程化的线程池   
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
4、使用newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。  
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);

注意: 在阿里巴巴开发手册中,线程池的创建不在允许使用Executors去创建,因为会造成OOM异常,因此使用ThreadPoolExecutor的方式去创建,这样可以了解线程池的运行规则,避免看资源耗尽的风险。

4.线程池的四大拒绝策略?

等待的任务队列满了,容纳不了新的任务,无法去创建非核心线程去处理任务,此时就需要拒绝策略。

  • AbortPolicy 抛出一个rejectedExecutionException异常阻止系统的正常运行。这是线程池默认的拒绝策略,在任务不能再提交的时候,抛出异常,及时反馈程序运行状态。如果是比较关键的业务,推荐使用此拒绝策略,这样子在系统不能承载更大的并发量的时候,能够及时的通过异常发现
  • CallRunsPolicy 将任务会退到调用者,由调用者去处理该任务。
  • DiscardPolicy 直接丢掉任务,不处理也不抛出异常,如果线程队列已满,则后续提交的任务都会被丢弃,且是静默丢弃。
  • DiscardOldestPolicy 丢弃任务队列中等待最久的任务,将当前任务放入到任务队列中。

5.线程池的七大参数?

int corePoolSize,  //核心线程数量
int maximumPoolSize,//最大线程数量
long keepAliveTime,// 非核心线程存活时间
TimeUnit unit,// 线程存活时间单位
BlockingQueue<Runnable> workQueue,//阻塞队列 
ThreadFactory threadFactory,//线程工厂,一般用于创建线程
RejectedExecutionHandler handler //拒绝策略。当队列满了并且工作线程大于等于线程池的最大线程数

6.线程池的执行流程

请添加图片描述

1.在创建线程池后,等待提交过来的任务申请

2.调用Execute()之前,会做如下判断:

  • 当前线程数小于corePoolSize时,通过创建核心线程运行这个任务
  • 当前线程数大于或等于corePoolSize时,将该线程放入到任务队列中
  • 如果任务队列满了且正在运行的线程数小于maximumPoolSize时,那么创建一个非核心线程去执行这个任务
  • 如果任务队列满了且正在运行的线程数大于或等于maximumPoolSize时,线程池会请求一个拒绝策略

3,当前线程执行完后,会从队列中取下一个任务来执行

在这里插入图片描述

7.如何合理分配线程池

根据线程池的执行任务,合理创建线程池的大小。

7.1 CPU密集

特点:和内存打交道,大量计算,但是没有阻塞,一般在多核CPU上可能得到加速

配置:配置CPU核数 + 1个线程的线程池

案例:正则匹配问题

7.2 IO密集

特点: 需要大量的IO.即存在大量的阻塞。在单线程任务中会导致浪费大量的CPU运算能力浪费在等待上,一般用在多线程的任务中,因为IO密集型的CPU的使用率不高,可以让CPU等待IO时候去处理别的任务,做到充分利用CPU时间。

案例:磁盘,网络,文件,数据库之间的交互。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值