基础面试题——什么是线程池?如何实现的?

线程池 是 Java 中用于管理和重用一组线程的机制。
它通过维护一个线程的集合来执行任务,从而减少了频繁创建和销毁线程的开销,
提高了应用程序的性能和响应速度

Java中最常用的是通过 ExecutorService 接口及其实现类 ThreadPoolExecutor创建线程池;

Java还可以通过 Executors(执行器)工具类,可以方便地创建预定义的线程池,分别是:

  1. newCachedThreadPool(int Threads):创建定长的线程池,可控制线程最大并发数,超出的线程会在队列中等待。

  2. newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行

  3. newCachedThreadPool 创建一个可缓存线程池 ,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

  4. newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序执行。

Java提供的4种线程池,只是预想了一些使用场景,使用参数定义的而已,我们在使用的过程中,
完全可以根据业务需要,自己去定义一些其他类型的线程池来使用(如果需要的话)
上述线程池创建,无论是哪一个都是调用ThreadPoolExecutor 构造方法:
ThreadPoolExecutor 是 Java 中线程池的核心实现类,它提供了多种构造方法来灵活地配置线程池的行为

ThreadPoolExecutor构造方法参数(7个)及其意义:

corePoolSize(核心线程数):这是线程池中能同时存在的最小线程数,即使在空闲状态下,这些线程也不会被销毁。设置合适的核心线程数能够保证线程池中有足够数量的线程来处理任务,通常设置为CPU的核心数。

maximumPoolSize(最大线程数):当工作队列已满且继续提交任务时,线程池会创建新的线程,直到达到此设定的最大线程数。此参数限制了线程池能创建的最大线程数量,建议设置为 CPU核心数的两倍。

keepAliveTime(空闲线程存活时间):当线程池中的线程数量超过corePoolSize时,超过一定时间没有任务执行的线程会被终止。这个时间间隔由keepAliveTime设定。合理的设置可以避免在空闲时占用过多资源。

unit(时间单位):该参数用于指定keepAliveTime的时间单位,如秒、毫秒等。

workQueue(任务队列):这是一个阻塞队列,用于存放待执行的任务。选择合适的队列类型对线程池性能有重要影响。常用的队列类型有ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue等。

threadFactory(线程工厂):这是一个用于创建新线程的工厂类。通过自定义线程工厂,可以为线程池中的线程定制名称、是否是守护线程等属性。

handler(拒绝策略):当线程池和任务队列都满了,无法处理新任务时,将采用此策略处理。常见的拒绝策略有AbortPolicy(抛出异常)、DiscardPolicy(丢弃任务)、CallerRunsPolicy(调用者运行该任务)。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值