线程池

什么是线程池?

一种线程使用模式。事先创建若干个可执行的线程放入一个池(容器)中,需要的时候从池中获取线程不用自行创建,使用完毕不需要销毁线程而是放回池中,从而减少创建和销毁线程对象的开销。

为什么要用线程池?

线程过多会带来调度开销,进而影响缓存局部性和整体性能。线程池主要用来解决线程生命周期开销问题和资源不足问题。线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。

线程池执行任务的流程?

提交任务,线程数是否小于核心线程数。是:开启核心线程,否:进入阻塞队列,如果队列也满了创建非核心线程

线程池有哪几种类型?

  • 1.newCachedThreadPool

  • 2.newFixedThreadPool

  • 3.newSingleThreadExecutor

  • 4.newScheduleThreadPool

  • 5.newSingleThreadScheduledExecutor

  • 1.newCachedThreadPool 作用:

    创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们,并在需要时使用提供的 ThreadFactory 创建新线程。

    特征: (1)线程池中数量没有固定,可达到最大值(Interger. MAX_VALUE) (2)线程池中的线程可进行缓存重复利用和回收(回收默认时间为1分钟) (3)当线程池中,没有可用线程,会重新创建一个线程

    创建方式:

    Executors.newCachedThreadPool();

    2.newFixedThreadPool 作用:

    创建一个可重用固定线程数的线程池,

3.newSingleThreadExecutor 作用:

创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程。

特征: (1)线程池中最多执行1个线程,之后提交的线程活动将会排在队列中以此执行

4.newScheduleThreadPool 作用:

创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。

特征: (1)线程池中具有指定数量的线程,即便是空线程也将保留 (2)可定时或者延迟执行线程活动

5.newSingleThreadScheduledExecutor 作用:

创建一个单线程执行程序,它可安排在给定延迟后运行命令或者定期地执行。 特征: (1)线程池中最多执行1个线程,之后提交的线程活动将会排在队列中以此执行 (2)可定时或者延迟执行线程活动

线程池核心参数? 7个

corePoolSize 线程池核心线程数

maximumPoolSize 线程池最大线程数

handler 拒绝策略

keepAliveTime 空闲线程存活时间

unit 空闲线程存活时间单位

workQueue 工作队列

threadFactory 线程工厂

线程池的拒绝策略?

AbortPolicy:丢弃任务并抛出 RejectedExecutionException 异常。(默认这种) DiscardPolicy:丢弃任务,但是不抛出异常 DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程) 。也就是当任务被拒绝添加时,会抛弃任务队列中最旧的任务也就是最先加入队列的,再把这个新任务从队尾添加进去,等待执行。 CallerRunsPolicy:谁调用,谁处理。由调用线程(即提交任务给线程池的线程)处理该任务,如果线程池已经被shutdown则直接丢弃

posted @ 2022-09-08 19:11  我来偷家了  阅读(27)  评论(0编辑  收藏  举报