浅谈面试时的线程池

线程池的相关问题

目录

线程池的相关问题

谈谈线程池的理解

线程池的核心参数

线程池运行过程

常见线程池有哪些以及使用场景?

为什么要使用线程池?

谈谈线程池的状态 

 线程池的四种拒绝策略

线程池有哪几种工作队列


谈谈线程池的理解

    管理线程的池子,相比于手工创建、运行线程,使用线程池,有以下优点:
  •  减少创建线程和销毁线程的系统开销;
  •  提高响应速度;
  •  提高线程的管理型;

线程池的核心参数

    1.CorePoolSize:核心线程数量,也可以说是最小线程数量
    2.maximunPoolSize:最大线程数量,线程池中允许创建的最大线程数量,包含了核心线程数量
    3.keepAliveTime:非核心线程的存活时间,如果非核心线程的空闲时间大于存活时间那么就会被回收
    4.unit:非核心线程的存活时间的单位
    5.workQueue:阻塞队列,用于存储等待执行的任务
    6.threadFactory:线程工厂,用于创建线程和自定义对线程的命名
    7.handler:拒绝策略,当需要的线程数量大于最大线程数量时就会执行拒绝策略

线程池运行过程

    当提交一个线程任务时,线程池会分配一个空闲线程去执行该任务。
     如果线程池中不存在空闲线程的话,会判断当前线程数量是否大于核心线程数量;
         如果小于核心线程数量,就创建一个核心线程去执行该任务;
         如果大于核心线程数量,就会判断工作队列是否已满;
             如果未满就会将该任务加到工作队列中;
             如果工作队列已满,就会判断当前线程数量是否大于最大线程数量;
                 如果小于最大线程数量,就会创建一个非核心线程去执行该任务; 
                 如果大于最大线程数量,就会执行拒绝策略;
    所以,线程池的运行过程是:核心线程 —— 工作队列 —— 非核心线程
 

常见线程池有哪些以及使用场景?

         FixedThreadPool,固定线程数量的线程池
        使用场景:适用于处理CPU密集型的任务,确保CPU在长期被工作线程使用的情况下,尽可能的少的分配线程,即适用执行长期的任务。
         CachedThreadPool,动态创建线程的线程池
        使用场景: 用于并发执行大量短期的小任务。  
         SingleThreadPool,单线程的线程池
        使用场景:适用于串行执行,按顺序执行的线程任务
         SchedThreadPool,执行定时,周期性任务的线程池
        使用场景:周期性执行任务,并且需要限制线程数量的需求场景。

为什么要使用线程池?

    管理线程的池子,相比于手工创建、运行线程,使用线程池,有以下优点:
  •  减少创建线程和销毁线程所造成的系统开销;
  •  提高响应速度,任务到达时,相对于手动创建一个线程,直接从线程池中拿一个线程,速度肯定会快许多;
  •  提高线程的管理型,线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。

谈谈线程池的状态 

        RUNNING:运行状态,只要线程池一旦被创建,就会处于运行状态。

        SHUTDOWN:关闭状态,停止接受新的线程任务,但是会继续执行正在执行的任务和工作队列中的任务。

        STOP:停止状态,停止接受新的任务,也不会继续执行工作队列里的任务,正在运行的任务会被中断。

        TIDYING:整理状态,表示线程池中所有的任务都终止执行。

        TERMINATED:表示线程池彻底终止。

 

 线程池的四种拒绝策略

        AbortPolicy:默认策略,丢弃任务并抛出RejectedExecutionException异常;

        DiscardPolicy:丢弃任务,但不抛异常;

        DiscardOldestPolicy:丢弃队列中的末尾任务(最早进入队列的任务),继续将当前任务提交给线程池;

        CallerRunsPolicy:交给调用线程池的线程进行处理(谁调用,谁处理);

线程池有哪几种工作队列?

        ArrayBlockingQueue(有界队列):基于数组实现,按照FIFO的方式进行排序;

        LinkedBlockingQueue(可设置容量队列):基于链表实现,按照FIFO的方式进行排序,可以选择设置容量,如果不设置的话,最大长度为Integer.MAX_VALUE,可视为无界队列;FixedThreadPoolSingleThreadExecutor线程池使用LinkedBlockingQueue 队列;

        DelayedWorkQueue(延迟队列):是基于堆结构的延迟队列,基于数组实现,该队列根据指定的延迟时间从小到大排序,如果延迟时间相同,则根据插入到队列的先后排序。ScheduledThreadPool线程池使用了这个队列。

        PriorityBlockingQueue(优先级队列):是一个基于优先级的无界队列(优先级的判断通过构造函数传入的Compator或元素实现Comparable接口来决定)。

        SynchronousQueue(同步队列):不存储元素的阻塞队列(内部没有保存元素的数据结构容器),每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态。CachedThreadPool线程池使用这个队列。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值