J.U.C线程池

 

线程是一个程序员一定会涉及到的概念,但是线程的创建和切换都是代价比较大的。所以,我们需要有一个好的方案能做到线程的复用,这就涉及到一个概念——线程池。合理的使用线程池能够带来3个很明显的好处:

  1. 降低资源消耗:通过重用已经创建的线程来降低线程创建和销毁的消耗

  2. 提高响应速度:任务到达时不需要等待线程创建就可以立即执行。

  3. 提高线程的可管理性:线程池可以统一管理、分配、调优和监控。

4大线程池

FixedThreadPool 正规线程

我的理解这是一个有指定的线程数的线程池,有核心的线程,里面有固定的线程数量,响应的速度快。正规的并发线程,多用于服务器。固定的线程数由系统资源设置。

SingleThreadExecutor 单线程线程池

作为单一worker线程的线程池,它把corePool和maximumPoolSize均被设置为1,和FixedThreadPool一样使用的是无界队列LinkedBlockingQueue,所以带来的影响和FixedThreadPool一样。

CachedThreadPool 缓存线程池

这个线程池在执行 大量短生命周期的异步任务时,可以显著提高程序性能。它把corePool设置为0,maximumPoolSize设置为Integer.MaxValue

ScheduledThreadPool 延迟线程池

可以实现线程的周期和延迟调度

线程池七大参数介绍

(1)corePoolSize:线程池中常驻核心线程数

(2)maximumPoolSize:线程池能够容纳同时执行的最大线程数,此值必须大于等于1

(3)keepAliveTime:多余的空闲线程存活时间。当前线程池数量超过corePoolSize时,当空闲时间到达keepAliveTime值时,多余空闲线程会被销毁直到只剩下corePoolSize个线程为止。

(4)unit:keepAliveTime的时间单位

(5)workQueue:任务队列,被提交但尚未执行的任务

(6)threadFactory:表示生成线程池中的工作线程的线程工厂,用于创建线程,一般为默认线程工厂即可

(7)handler:拒绝策略,表示当队列满了并且工作线程大于等于线程池的最大线程数(maximumPoolSize)时如何来拒绝来请求的Runnable的策略

拒绝策略场景分析

AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。 (默认)

DiscardPolicy:丢弃任务,但是不抛出异常。如果线程队列已满,则后续提交的任务都会被丢弃,且是静默丢弃。

DiscardOldestPolicy:丢弃队列最前面的任务,然后重新提交被拒绝的任务。

CallerRunsPolicy:由调用线程处理该任务

公平锁和非公平锁

1、公平锁能保证:老的线程排队使用锁,新线程仍然排队使用锁。 2、非公平锁保证:老的线程排队使用锁;但是无法保证新线程抢占已经在排队的线程的锁

posted @ 2021-03-22 23:24  余一洋  阅读(31)  评论(0编辑  收藏  举报