线程池
什么是线程池?
一种
为什么要用线程池?
线程过多会带来调度开销,进而影响缓存局部性和整体性能。线程池主要用来解决线程生命周期开销问题和资源不足问题。线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。
线程池执行任务的流程?
提交任务,线程数是否小于核心线程数。是:开启核心线程,否:进入阻塞队列,如果队列也满了创建非核心线程。
线程池有哪几种类型?
-
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)可定时或者延迟执行线程活动
corePoolSize
maximumPoolSize 线程池最大线程数
handler 拒绝策略
keepAliveTime 空闲线程存活时间
unit 空闲线程存活时间单位
workQueue 工作队列
threadFactory 线程工厂
线程池的拒绝策略?
AbortPolicy:丢弃任务并抛出 RejectedExecutionException 异常。(默认这种) DiscardPolicy:丢弃任务,但是不抛出异常 DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程) 。也就是当任务被拒绝添加时,会抛弃任务队列中最旧的任务也就是最先加入队列的,再把这个新任务从队尾添加进去,等待执行。 CallerRunsPolicy:谁调用,谁处理。由调用线程(即提交任务给线程池的线程)处理该任务,如果线程池已经被shutdown则直接丢弃